media-analyzer

架构复核与当前缺陷

本次复核基于当前 master 工作区状态。当前工作区是干净的,说明本文档记录的是仓库当前实现,而不是未提交 diff。

架构确认

项目当前的总体设计是合理的:各解析器都尽量输出统一分析结果,再由浏览器侧模型消费。

输入 Uint8Array
  -> detectContainerFormat
  -> 各格式 parser
  -> { format, streams, frames, formatSpecific }
  -> browser models / examples

主要分层如下:

这个方向的优势是:UI 不必关心每种容器的原始结构,只需要处理统一的 streamsframes。当前最大的问题也正出在这个统一模型还不够严格:frames[].offset/size 在不同容器里表达的不是同一种范围。

高优先级缺陷

1. PS 视频 PES 长度为 0 时会被 Annex-B NAL start code 截断

位置:lib/mpegPs/psParse.js

detectPesPacketLength()PES_packet_length === 0 时直接调用 findNextPsStartCode(bytes, offset + 6)。但 H.264/H.265 ES 负载本身大量包含 00 00 01 xx NAL start code,这会被误认为下一个 PS packet start code。

影响:

复现用例已验证:一个 PES_packet_length=0 且 payload 以 00 00 01 65 开始的 PES,被解析成 _byteLength=9,只剩 PES 头,没有 ES payload。

建议修复:

2. Annex-B HEVC codec 探测会把部分 HEVC slice 误判成 H.264

位置:lib/mpegTs/tsPesParse.js

detectAnnexBVideoCodecFromPesPayload() 先用单字节 H.264 NAL type 判断,再用 HEVC 两字节 header 判断。HEVC IDR/slice 的首字节也可能让 first & 31 落在 H.264 合法范围内,例如 HEVC IDR 首字节 0x26 会被判成 H.264。

影响:

复现用例已验证:

detectAnnexBVideoCodecFromPesPayload(Uint8Array.from([0,0,0,1,0x26,0x01,0x88]))
// 当前返回 "h264",实际是 HEVC IDR 类 NAL

建议修复:

3. parseIsoBmffForAnalysis 不能真正解析 fMP4 media fragments

位置:lib/streaming/mp4ParserWsAdapter.js

当前 MP4 分析只走 trak -> mdia -> minf -> stbl sample table,依赖 stsz/stsc/stco/stts/ctts/stss 生成 sample frame。fragmented MP4 的媒体样本通常在 moof/traf/tfhd/tfdt/trun + mdat,这里没有解析。

影响:

建议修复:

中优先级缺陷

4. frames[].offset/size 的语义不统一

位置:lib/codec/flvAnalysis.jslib/mpegTs/parseMpegTsForAnalysis.jslib/browser/frameInspectorModel.js

当前不同容器对 offset/size 的含义不一致:

影响:

建议修复:

统一拆成明确字段:

{
  fileRange: { offset, length },       // 原文件中的连续容器范围
  payloadRange: { offset, length },    // 原文件中连续编码 payload 范围;没有则 null
  payloadBytes: Uint8Array | null,     // 非连续组装后的 ES/AU bytes
  containerRange: { offset, length }   // 可选,完整 tag/PES/box 范围
}

短期至少要在文档和 adapter 中明确:offset/size 只是列表显示字段,不保证可直接切出可播放 payload。

5. 纯音频格式没有逐帧时间线

位置:lib/codec/audioMinimalAnalysis.js

WAV/FLAC/MP3/Opus 目前只做 header 级分析,frames 始终为空。

影响:

建议修复:

6. 缺少自动化测试和固定样本回归

当前仓库没有 npm 测试脚本,也没有 parser fixture。已经存在多处启发式逻辑:TS access unit 合并、PS start code 扫描、HEVC/H.264 探测、FLV sequence header 处理、MP4 edit list/ctts 修正。没有固定样本时,很容易修一个容器打破另一个容器。

建议优先增加轻量测试:

设计建议

  1. 把统一数据契约再收紧,尤其是 frame byte range。
  2. parser 层只产出数据,不把浏览器播放假设塞回 parser。
  3. browser 层允许有容器特化适配,但要通过明确字段适配,而不是猜 offset/size
  4. 先修 PS length 0 和 HEVC 探测,这两个会直接让解析结果错误。
  5. 再补 fMP4 fragment path,否则 streaming/mp4ParserWsAdapter 的命名和实际能力不完全匹配。

本次验证