From 6f1f82a0d2bdbdbbe9e222c2e1f469f0c0d3f5e6 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:19:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20demuxSegment=E6=B7=BB=E5=8A=A05=E7=A7=92?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E4=BF=9D=E6=8A=A4+=E9=98=B2=E9=87=8D?= =?UTF-8?q?=E5=A4=8Dresolve=EF=BC=8C=E7=A1=AE=E4=BF=9DPromise=E5=BF=85?= =?UTF-8?q?=E5=AE=9Aresolve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 resolved 标志位,防止多次 resolve - 5秒超时保护:onSamples 未触发时 resolve(null) - 所有 resolve 路径前加 clearTimeout + resolved = true - onSamples 开头检查 resolved,防止重复处理 --- .../pages/generate/hooks/useCanvasPlayer.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts index e5acdd92d..a684ac0dc 100644 --- a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts +++ b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts @@ -277,11 +277,25 @@ export function useCanvasPlayer( return new Promise((resolve) => { let meta: SegmentMeta | null = null + let resolved = false + + // ✅ 超时保护:5秒后如果 onSamples 没有触发,返回 null + const timeout = setTimeout(() => { + if (!resolved) { + console.error( + `[useCanvasPlayer] Timeout: onSamples not triggered for segment ${segIndex}`, + ) + resolved = true + resolve(null) + } + }, 5000) mp4File.onReady = (info: Movie) => { const videoTrack = info?.videoTracks?.[0] if (!videoTrack) { console.warn("[useCanvasPlayer] No video track found for segment", segIndex) + clearTimeout(timeout) + resolved = true resolve(null) return } @@ -324,7 +338,11 @@ export function useCanvasPlayer( } mp4File.onSamples = (_trackId: number, _user: unknown, samples: Sample[]) => { + if (resolved) return // ✅ 防止重复 resolve + if (!meta) { + clearTimeout(timeout) + resolved = true resolve(null) return } @@ -368,11 +386,15 @@ export function useCanvasPlayer( ) // ✅ 关键修复:等待 onSamples 完成后再返回 + clearTimeout(timeout) + resolved = true resolve(meta) } mp4File.onError = (_module: string, message: string) => { console.error(`[useCanvasPlayer] MP4Box error: ${message}`) + clearTimeout(timeout) + resolved = true resolve(null) }