From 60d95e64abb0fdad42462ea3043fbf615d8e1758 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:06:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20HEVC=20description=E5=81=8F=E7=A7=BB?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3+=E8=B0=83=E8=AF=95=E6=97=A5=E5=BF=97=20(#145?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/generate/hooks/useCanvasPlayer.ts | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts index 681467161..12933fc01 100644 --- a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts +++ b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts @@ -36,15 +36,27 @@ function findCodecConfig(buffer: ArrayBuffer, start: number, end: number): Array // SampleDescriptionBox 是 fullbox: 8 header + 4 version/flags + 4 entry_count const entryCount = view.getUint32(offset + 12) let entryOffset = offset + 16 + console.log("[findCodecConfig] stsd found:", { + entryCount, + stsdOffset: offset, + stsdSize: size, + }) for (let i = 0; i < entryCount && entryOffset < offset + size; i++) { const entrySize = view.getUint32(entryOffset) + const entryType = String.fromCharCode( + view.getUint8(entryOffset + 4), + view.getUint8(entryOffset + 5), + view.getUint8(entryOffset + 6), + view.getUint8(entryOffset + 7), + ) + console.log("[findCodecConfig] entry:", { index: i, entryOffset, entrySize, entryType }) // 视觉样本条目: 8 header + 6 reserved + 2 data_ref_index + remaining // 子 box 从 entryOffset + 16 + 62 开始 (skip reserved + data_ref_index + predefined) // 实际结构: 8(header) + 6(reserved) + 2(data_ref_index) + 16(predefined+reserved) + 2(width) + 2(height) + ... // 子 box 从 entryOffset + 8 + 6 + 2 + 16 + 2 + 2 + 2 + 2 + 4 + 2 + 2 + 2 + 2 = entryOffset + 78 // 更简单的做法:扫描 entry 内的子 box const entryEnd = entryOffset + entrySize - const subBoxStart = entryOffset + 8 + 70 // VisualSampleEntry 固定字段共 70 字节 + const subBoxStart = entryOffset + 8 + 78 // VisualSampleEntry 固定字段共 78 字节(ISO 14496-12) const result = findCodecConfig(buffer, subBoxStart, entryEnd) if (result) return result entryOffset += entrySize @@ -246,7 +258,15 @@ export function useCanvasPlayer( view.getUint8(offset + 7), ) if (type === "moov") { - return findCodecConfig(buffer, offset + 8, offset + size) + const result = findCodecConfig(buffer, offset + 8, offset + size) + console.log("[useCanvasPlayer] extractCodecDescription:", { + moovOffset: offset, + moovSize: size, + searchRange: [offset + 8, offset + size], + found: !!result, + resultByteLength: result?.byteLength, + }) + return result } if (size === 0) break offset += size