preloadMoovSegment method
预加载 moov 分片
Implementation
Future<void> preloadMoovSegment() async {
if (!isMp4Format || _moovPreloaded || _moovAtStart == true) return;
if (_segments.isEmpty || contentLength <= 0) return;
final lastSegment = _segments.last;
// 已完成或正在下载,无需再入队
if (lastSegment.isCompleted || lastSegment.isDownloading) {
_moovPreloaded = true;
return;
}
log(() => 'Preloading moov segment: $lastSegment');
_moovPreloaded = true; // 标记已入队,避免重复入队
// 提交到下载队列,使用较高优先级确保 moov 快速下载
GlobalDownloadQueue().enqueue(
mediaUrl: mediaUrl,
segment: lastSegment,
cacheDir: cacheDir,
headers: requestHeaders,
priority:
MediaProxyConfig.instance.priorityPlayingUrgent - 50, // 150,仅次于首帧分片
onProgress: (bytes) {
updateSegmentStatus(lastSegment, SegmentStatus.downloading, bytes);
},
onComplete: (success) {
if (success) {
updateSegmentStatus(lastSegment, SegmentStatus.completed);
} else {
_moovPreloaded = false; // 失败则允许重试
}
},
);
}