【发布时间】:2019-05-16 03:37:33
【问题描述】:
我正在尝试调查我正在生成返回错误的 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 编码的文件中,视频样本不是以0x000001 或0x00000001 开头的。
我尝试查看 MP4 规范和 H.264 规范以了解为什么有时需要此启动代码但在这种情况下不需要,但实际上有数百页,我在一天的阅读中找不到任何内容.
ffmpeg 生成的文件可在此处获得:http://files.stevendesu.com/test.mp4
如果您使用 MP4 atom 解析器打开它,您会注意到第一个 mdat atom 开始:
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 开头。根据前面moof 中的traf 原子,第一个视频样本(持续时间为800/16000 秒,大小为19899 字节)应该正好从这里开始。因此0x000004是第一个视频样本的前3个字节。
此视频示例不是以 NALU 起始代码开头,或者 NALU 周围有一些我不理解的标头/包装器。
谁能向我解释为什么这个视频示例不以 NALU 起始码开头?
【问题讨论】:
-
mp4 最初不包含起始代码,请检查此答案,例如 stackoverflow.com/a/29103276/1573638
-
这是我遗漏的关键 :) Annex-B 与 AVCC。谢谢您的帮助。现在我知道要查看 AVCC,我可能能够理解此错误消息。