From 472f371d2f2c1210646cc69bddb0b815e68c49a5 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 22:51:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20VisualSampleEntry=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20fallback=20=E6=90=9C=E7=B4=A2=EF=BC=8C=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=20MP4=20=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 先尝试 offset+8+78(标准 VisualSampleEntry 结构) - 未找到则 fallback 到 offset+8(兼容非标准 MP4) - 添加调试日志追踪搜索过程 --- .../pages/generate/hooks/useCanvasPlayer.ts | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts index f2280c305..6e19db61d 100644 --- a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts +++ b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts @@ -42,12 +42,24 @@ function findCodecConfigRecursive( return buffer.slice(offset + 8, offset + size) } - // VisualSampleEntry (avc1/avc3/hvc1/hev1) 前 78 字节是固定字段,子 box 在 78 字节之后 - // 普通容器 box (moov/trak/mdia/minf/stbl/stsd) 从 offset+8 开始递归 const visualSampleEntryTypes = ["avc1", "avc3", "hvc1", "hev1"] - const childStart = visualSampleEntryTypes.includes(type) ? offset + 8 + 78 : offset + 8 - const childResult = findCodecConfigRecursive(buffer, childStart, offset + size) - if (childResult) return childResult + const isVisualSampleEntry = visualSampleEntryTypes.includes(type) + + if (isVisualSampleEntry) { + // VisualSampleEntry: 前 78 字节是固定字段,子 box 在 78 字节之后 + // 先尝试 offset+8+78,如果没找到再尝试 offset+8(兼容不同 MP4 结构) + console.log("[findCodecConfig] VisualSampleEntry:", type, "at", offset, "size", size, "trying offset+8+78") + const childResult1 = findCodecConfigRecursive(buffer, offset + 8 + 78, offset + size) + if (childResult1) return childResult1 + + console.log("[findCodecConfig] VisualSampleEntry:", type, "at", offset, "trying offset+8 (fallback)") + const childResult2 = findCodecConfigRecursive(buffer, offset + 8, offset + size) + if (childResult2) return childResult2 + } else { + // 普通容器 box,从 offset+8 开始递归 + const childResult = findCodecConfigRecursive(buffer, offset + 8, offset + size) + if (childResult) return childResult + } offset += size }