preloadMoovSegment method

Future<void> preloadMoovSegment()

预加载 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; // 失败则允许重试
      }
    },
  );
}