1

我正在从 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 原子应该包含 NAL 格式的 H.264 流。

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

我不想使用任何库。

谢谢你的帮助。

4

1 回答 1

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 ...

所以基本上你用保持这个NAL单元长度的整数替换每个分隔符'00 00 00 01'。

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

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

于 2013-05-13T21:43:02.673 回答