我需要检查 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(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