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