为什么 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
编码的文件中,视频样本不是以 0x000001
或 0x00000001
.
开头
我尝试查看 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 数据。
我正在尝试调查我正在生成的 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 原子解析器打开它,您会注意到第一个 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 数据。