为什么MP4 mdat atom不能以H.264 NALU启动代码开头?

问题描述 投票:0回答:1

我正在尝试调查我正在生成的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原子的大小,ASCII中的6D646174 =“mdat”

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

这个视频示例不是以NALU开始代码开头的,或者在NALU周围有一些我不理解的标题/包装。

任何人都可以向我解释为什么这个视频样本不是以NALU开始代码开头的?

video ffmpeg mp4 h.264
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.