diff --git a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts index de2448fce..13e91ae93 100644 --- a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts +++ b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts @@ -479,12 +479,7 @@ export function useCanvasPlayer( // ── 初始化 VideoDecoder 并解码指定片段 ── const decodeSegment = useCallback( - async ( - _buffer: ArrayBuffer, - meta: SegmentMeta, - maxFrames?: number, - startFrame: number = 0, - ): Promise => { + async (_buffer: ArrayBuffer, meta: SegmentMeta, maxFrames?: number): Promise => { console.log(`[DIAG_v2] >>> decodeSegment ENTER assetId=${meta.assetId}`) if (isDestroyedRef.current) return @@ -580,7 +575,8 @@ export function useCanvasPlayer( let decodedCount = 0 let skippedCount = 0 let decodeErrors = 0 - for (let si = startFrame; si < samplesCollected.length; si++) { + // 永远从 0 开始,确保第一个 sample 是关键帧 + for (let si = 0; si < samplesCollected.length; si++) { const sample = samplesCollected[si] // seek/重播时旧的 decodeSegment 立即退出,不往帧队列推废帧 if (decodeGenerationRef.current !== gen) { @@ -651,7 +647,7 @@ export function useCanvasPlayer( ) // 记录该片段已解码帧数(用于 decodeAroundPosition 续解码) - const totalDecoded = decodedCount + startFrame + const totalDecoded = decodedCount const metaArr = segmentMetaRef.current for (let idx = 0; idx < metaArr.length; idx++) { if (metaArr[idx].assetId === meta.assetId) { @@ -719,7 +715,7 @@ export function useCanvasPlayer( const currentCount = decodedFrameCountsRef.current.get(i) ?? 0 if (currentCount >= totalSamples) continue try { - await decodeSegment(buffer, meta, 300, currentCount) + await decodeSegment(buffer, meta, 300) } catch (e) { console.warn(`[useCanvasPlayer] 续解码片段 ${i} 失败:`, e) } @@ -730,8 +726,7 @@ export function useCanvasPlayer( // 未开始解码的片段:开始解码 decodedSegmentsRef.current.add(i) try { - const startFrame = decodedFrameCountsRef.current.get(i) ?? 0 - await decodeSegment(buffer, meta, 300, startFrame) + await decodeSegment(buffer, meta, 300) } catch (e) { decodedSegmentsRef.current.delete(i) console.warn(`[useCanvasPlayer] 按需解码片段 ${i} 失败:`, e)