diff --git a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts index a684ac0dc..3eea8361b 100644 --- a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts +++ b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts @@ -292,6 +292,17 @@ export function useCanvasPlayer( mp4File.onReady = (info: Movie) => { const videoTrack = info?.videoTracks?.[0] + + console.log("[useCanvasPlayer] demuxSegment:", { + segIndex, + startTime: segment.startTime, + endTime: segment.endTime, + nbSamples: videoTrack?.nb_samples, + codec: videoTrack?.codec, + videoWidth: videoTrack?.track_width, + videoHeight: videoTrack?.track_height, + }) + if (!videoTrack) { console.warn("[useCanvasPlayer] No video track found for segment", segIndex) clearTimeout(timeout) @@ -311,11 +322,20 @@ export function useCanvasPlayer( } } - // 缓存 description 供后续分片使用 - if (description) { - descriptionCache.current.set(segment.assetId, description) + // ✅ 如果 description 缺失,无法解码 HEVC + if (!description) { + console.error( + `[useCanvasPlayer] No description found for segment ${segIndex}, cannot decode HEVC`, + ) + clearTimeout(timeout) + resolved = true + resolve(null) + return } + // 缓存 description 供后续分片使用 + descriptionCache.current.set(segment.assetId, description) + meta = { assetId: segment.assetId, videoUrl: segment.videoUrl, @@ -332,7 +352,7 @@ export function useCanvasPlayer( // 提取所有 samples mp4File.setExtractionOptions(videoTrack.id ?? 1, null, { - nbSamples: videoTrack.nb_samples ?? 0, + nbSamples: videoTrack.nb_samples || 10000, }) mp4File.start() }