From 8b53c4a13076caf32174b8baef01e5b02ce2d472 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 20 Aug 2026 11:05:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E8=A7=A3=E7=A0=81=E7=AB=9E=E6=80=81=E2=80=94=E2=80=94=E5=85=88?= =?UTF-8?q?=E6=A0=87=E8=AE=B0=E5=86=8D=E8=A7=A3=E7=A0=81=EF=BC=8C=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=97=B6=E7=A7=BB=E9=99=A4=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit decodeAroundPosition 和初始化循环中,将 decodedSegmentsRef.add() 移到 await decodeSegment() 之前(先标记防重入),catch 中 delete() 移除标记 (允许失败后重试)。解决渲染循环中解码未完成时下一帧重复发起解码的竞态。 Closes: #1437 --- apps/web/src/pages/generate/hooks/useCanvasPlayer.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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) } }