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 }