【问题标题】:Create MDAT from I-frame/P-frame fragments从 I 帧/P 帧片段创建 MDAT
【发布时间】:2013-01-07 08:40:17
【问题描述】:

我正在从 H.264 流创建一个 MPEG-4 文件。 H.264 流采用 NAL 格式(例如:0,0,0,1,67,...,0,0,1,68,...)。 每个视频帧作为多个 I 帧/P 帧片段传输。例如:第 1 帧包含大约 80 个 I 帧片段,第 2 帧包含大约 10 个 P 帧片段。

我了解 MPEG-4 文件的 MDAT atom 应该包含 NAL 格式的 H.264 流。

我想知道如何将这些片段转换为单个 I 帧,然后才能将其放入 MPEG-4 的 MDAT atom。

我不想使用任何库。

感谢您的帮助。

【问题讨论】:

    标签: h.264 mpeg-4


    【解决方案1】:

    您要将 H.264 Annex B NAL 流转换为 MP4 文件数据包。为此,您需要:

    • 将原始文件拆分为 NAL 单元(00 00 00 01 yy xx xx ...);
    • 定位帧边界:每个 H.264 帧通常包含多个切片和可选的其中之一:SPS、PPS、SEI。您需要解析上面的“yy”八位字节以确定您正在查看的 NAL 单元类型。现在,为了知道帧的边界,您需要解析每个切片的第一部分,称为“SliceHeader”,并比较后续切片的“frame_number”。
    • 只要知道帧边界,就可以形成 MP4 数据包。每个数据包将包含一个帧和 NAL 单元,格式如下:

      l1 l1 l1 l1 yy xx xx ...
      l2 l2 l2 l2 yy xx xx ...

    所以基本上你将每个分隔符 '00 00 00 01' 替换为包含此 NAL 单元长度的整数。

    • 然后,为了获得正确的 MP4 标头,您需要使用 MP4 复用器并在视频轨道的示例条目中填充正确的“AvcC”原子。

    这是一个相当乏味的过程,但如果你想深入了解细节,你可以研究 JCodec 的源代码 (http://jcodec.org):org.jcodec.samples.transcode.TranscodeMain, org.jcodec.containers.mp4.MP4Muxer

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 2017-02-19
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多