【问题标题】:Detection I Frame in h264 stream (fragmented mp4)检测 h264 流中的 I 帧(分段 mp4)
【发布时间】:2021-08-24 16:34:18
【问题描述】:

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

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

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

我该怎么做?

【问题讨论】:

    标签: mp4 h.264 encoder decoder fmp4


    【解决方案1】:

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

    【讨论】:

    • 你知道需要多少字节吗?
    • 您确定 mdat 块中存储了原始 h264 的内容吗? NAL 单元必须以“00 00 00 01”或“00 00 01”字节开头。我用十六进制编辑器查看了 mdat 块,但没有找到任何 NAL 块。我还尝试使用 ffmpeg 将 mp4 文件转换为原始 .h264 文件,并且使用 mdat 块获得了不同的数据。
    • @ВалентинНикин - 我更新了我的答案,如果你分享你的文件 - 我会看看。
    • 你好,马库斯!谢谢你。您可以从此链接获取我的文件。这是 fmp4 片段drive.google.com/file/d/1Vwcz8WsTuRLJie8SFzGspizyTc-caGjc/…
    • 你好。我试图从 mdat 块起点寻找 844 个字节 000048 Track Fragment Run (176 bytes) 000048 Header (8 bytes) ... 000054 sample_count: 13 (0x0000000D) 000058 data_offset: 844 (0x0000034C) 00005C 样本(12 字节)... 但我得到了最大的 NAL 大小“64 4A 55 D6”。对吗?
    猜你喜欢
    • 2010-12-29
    • 2013-09-15
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2021-09-13
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多