检测h264流中的I帧(fragmented mp4)

Detection I Frame in h264 stream (fragmented mp4)

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

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

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

我该怎么做?

您可以查看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