为什么MP4 mdat atom不以H.264 NALU起始码开头?

时间:2018-12-14 21:13:07

标签: video ffmpeg mp4 h.264

我正在尝试调查生成的MP4问题,该错误返回错误:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f0ae819080] Failed to add index entry
Last message repeated 277 times
[h264 @ 0x55f0ae81c300] Invalid NAL unit size (-800932280 > 6).

第一个帧解码完美,以后的所有帧均无法解码。这样会产生0.042秒的持续时间的视频。

为帮助进行调查,我以相同的方式ffmpeg对同一视频进行编码,以便可以比较这两个文件。但是,我注意到,在ffmpeg编码的文件中,视频样本并非以0x0000010x00000001开头。

我尝试浏览了MP4规范和H.264规范,以了解为什么有时有时需要此起始代码,但在这种情况下却不需要此起始代码,但是从字面上看,它有数百页,并且在阅读的当天我什么都找不到

ffmpeg生成的文件在此处可用:http://files.stevendesu.com/test.mp4

如果您使用MP4原子解析器打开它,您会注意到第一个mdat原子开始:

0000 6DF4 6D64 6174 0000 04BF 6588 8101
1788 8C12 0001 1498 3800 188E 003F FFFC
...

前8个字节有意义:00006DF4(28148)= mdat原子的大小,6D646174 = ASCII中的“ mdat”

此后,mdat原子以0x000004开始。根据前面的traf中的moof原子,第一个视频样本(持续时间为800/16000秒,大小为19899字节)应从此处准确开始。因此0x000004是第一个视频样本的前3个字节。

该视频样本不是以NALU起始代码开头,或者是我不理解的NALU周围有一些标头/包装。

任何人都可以向我解释为什么该视频示例不以NALU起始代码开头吗?

1 个答案:

答案 0 :(得分:0)

仅附件B文件将包含000001起始代码。我有AVCC数据。