From c3373de4f39d8d6dade99150bd8aee750aaaec75 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 20:29:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20findCodecConfig=20=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=20fullbox=EF=BC=8C=E4=BF=AE=E5=A4=8D=20conta?= =?UTF-8?q?iner=20box=20=E5=81=8F=E7=A7=BB=E8=AE=A1=E7=AE=97=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题根因: - 代码假设所有 container box (trak/mdia/minf/stbl) 都是 fullbox - 但实际 MP4 文件中这些 box 可能不是 fullbox,content 从 offset+8 开始而非 offset+12 - 导致递归查找时偏移错误,永远找不到 stsd → hvcC/avcC 修复方案: - 动态检测 fullbox:检查 offset+8 处的 version/flags 字节是否为 0 - 如果是 fullbox,content 从 offset+12 开始;否则从 offset+8 开始 - 在 containerBoxes 列表中添加 'moov' --- 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 12933fc01..902f9d5c2 100644 --- a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts +++ b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts @@ -25,11 +25,15 @@ function findCodecConfig(buffer: ArrayBuffer, start: number, end: number): Array view.getUint8(offset + 7), ) - // 容器 box(fullbox 多 4 字节) - const containerBoxes = ["trak", "mdia", "minf", "stbl"] + const containerBoxes = ["moov", "trak", "mdia", "minf", "stbl"] if (containerBoxes.includes(type)) { - // fullbox: size(4) + type(4) + version(1) + flags(3) = 12 bytes header - const contentStart = offset + 12 + // 动态检测 fullbox:检查 offset+8 处的 version/flags 是否为 0 + // 如果不是 fullbox,content 从 offset+8 开始;如果是 fullbox,content 从 offset+12 开始 + const v1 = view.getUint8(offset + 8) + const v2 = view.getUint8(offset + 9) + const v3 = view.getUint8(offset + 10) + const isFullBox = v1 === 0 && v2 === 0 && v3 === 0 + const contentStart = isFullBox ? offset + 12 : offset + 8 const result = findCodecConfig(buffer, contentStart, offset + size) if (result) return result } else if (type === "stsd") {