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

Why does MP4 mdat atom not start with H.264 NALU start code?

我正在尝试调查我正在生成的 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 = "mdat" in ASCII

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

要么这个视频示例不是以 NALU 起始代码开头,要么 NALU 周围有一些我不理解的 header/包装器。

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

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