From 7ed7a7592ebd285b31fed8f9bce5c8e43a8caea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=8F=E6=9D=B0?= Date: Wed, 19 Aug 2026 19:27:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Canvas=E6=92=AD=E6=94=BE=E5=99=A8?= =?UTF-8?q?=E5=85=A8=E9=87=8F=E4=BF=AE=E5=A4=8D=20-=20nbSamples/descriptio?= =?UTF-8?q?n/=E8=B0=83=E8=AF=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix 1: nbSamples 为 0 时传入 10000,确保 MP4Box 提取所有样本 - Fix 2: description 缺失时直接 resolve(null),避免无效解码 - Fix 3: 添加 demuxSegment 详细调试日志(segIndex/startTime/endTime/nbSamples/codec/videoWidth/videoHeight) --- .../pages/generate/hooks/useCanvasPlayer.ts | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) 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() }