video - 为什么 MP4 mdat atom 不以 H.264 NALU 起始码开头?
问题描述
我正在尝试调查我正在生成返回错误的 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
-encoded 文件中,视频样本不是以0x000001
or开头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
. 根据traf
前面的原子moof
,第一个视频样本(持续时间为 800/16000 秒,大小为 19899 字节)应该正好从这里开始。因此0x000004
是第一个视频样本的前 3 个字节。
此视频示例不是以 NALU 起始代码开头,或者 NALU 周围有一些我不理解的标头/包装器。
谁能向我解释为什么这个视频示例不以 NALU 开始代码开头?
解决方案
只有附件 B 文件将包含000001
起始代码。我有 AVCC 数据。
推荐阅读
- angular - 删除某些 http 调用 Angular 的授权标头
- r - R 描述文件:是否可以“有条件地”导入包?
- r - 从R中的日期因子更改数据框中列的数据类型
- c++ - 如何克服MSVC的成员方法指针模板参数扣减失败的bug?
- c# - 使用多个参数反序列化 WCF POST 请求时出错
- javascript - 如何隐藏使用外部代码插入页面的元素
- twilio - Twilio:是否可以一次调用多个客户端 ID?
- android - Android ListView 项目布局变化
- google-analytics - 是否可以将 GA 视图转移到 GA 属性?
- angular - Angular patchValue 不适用于 JsonConverter