1

我需要检查 H264 流中的第一帧是 I 帧。

在输入上,我有零碎的 mp4 文件。我试图在 moof->traf->trun "Sample depends on" 标志中找到框架类型。但似乎并不是每个容器都填充了这个标志。所以我想尝试用原始数据确定 mdat 块中的帧类型。

我只需要检查每个片段中的第一帧是 I 帧。关于其他帧的信息无关紧要。

我该怎么做?

4

1 回答 1

2

您可以检查 NAL 单元类型。NAL 单元类型 5 表示 IDR 帧,它是 I 帧。在“mdat”中存储视频:

<size><NAL><size><NAL>...<size><NAL>

每个 NAL 单元的第一个字节的低 5 位表示类型。跳过类型 6、7、8 和 9,直到找到类型 1(非 IDR 帧)或类型 5(IDR 帧)。

MP4 文件不应包含起始代码 ([00] 00 00 01) 或访问单元分隔符。

MPEG-2 传输流或 *.h264 raw 包含起始码 ([00] 00 00 01) 和访问码分隔符。

MP4 中的大小字段大部分时间为 4 个字节,但如果您想要正确的答案,您必须解析编解码器私有数据 (SPS/PPS)。

简而言之,H.264 有两种格式:

  • 附件 B 或
  • MP4 (mdat)

附件 B(MPEG-2 TS 或 *.264 原始文件):

<[00] 00 00 01> <NAL> <[00] 00 00 01> <NAL> ... <[00] 00 00 01> <NAL>

MP4 (mdat):

<size><NAL><size><NAL>...<size><NAL> 

您在https://drive.google.com/file/d/1Vwcz8WsTuRLJie8SFzGspizyTc-caGjc/view?usp=sharing中的文件在同一个 mdat 中有视频和音频。

因此,要使 I 帧检测可靠,您必须进行更多解析:

这为您提供了进入 mdat 的视频:

moof[i]->traf[0]->trun[0]->dataOffset

音频从这里开始 => 停止解析视频

moof[i]->traf[1]->trun[0]->dataOffset
于 2021-06-08T18:31:15.767 回答