Compare commits

...

1 Commits

Author SHA1 Message Date
张宏杰 afa1f5289b fix: HEVC description偏移修正(70→78)+调试日志
- findCodecConfig: VisualSampleEntry偏移从70改为78字节(ISO 14496-12)
- extractCodecDescription: 添加调试日志(moovOffset/moovSize/searchRange/found/resultByteLength)
- findCodecConfig: 添加stsd和entry的调试日志(entryCount/entryOffset/entrySize/entryType)
2026-08-19 20:06:43 +08:00
@@ -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