diff --git a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts index cb9593659..884c76633 100644 --- a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts +++ b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts @@ -567,11 +567,13 @@ export function useCanvasPlayer( const meta = metas[i] const buffer = segmentDataRef.current.get(meta.assetId) if (!buffer) continue + // 先标记为解码中,防止下一帧重复发起解码 + decodedSegmentsRef.current.add(i) try { await decodeSegment(buffer, meta) - // 解码成功后才标记,失败时下次重试 - decodedSegmentsRef.current.add(i) } catch (e) { + // 解码失败则移除标记,允许后续重试 + decodedSegmentsRef.current.delete(i) console.warn(`[useCanvasPlayer] 按需解码片段 ${i} 失败:`, e) } } @@ -860,11 +862,13 @@ export function useCanvasPlayer( const meta = metas[i] const buffer = segmentDataRef.current.get(meta.assetId) if (!buffer) continue + // 先标记为解码中,防止重复解码 + decodedSegmentsRef.current.add(i) try { await decodeSegment(buffer, meta) - // 解码成功后才标记,失败时不标记以便后续重试 - decodedSegmentsRef.current.add(i) } catch (e) { + // 解码失败则移除标记,允许后续重试 + decodedSegmentsRef.current.delete(i) console.warn(`[useCanvasPlayer] 初始化解码片段 ${i} 失败:`, e) } }