mp4 - 分析奇特的avcC原子结构
问题描述
我需要一些帮助来了解avcC
我正在尝试分析的特定 mp4 样本的原子结构。
十六进制转储:
00 00 00 38 61 76 63 43 01 64 00 1F FF E1 00 1C 67 64 00 1F AC D9 80 50 05 BB 01 6A 02 02 02 80 00 00 03 00 80 00 00 1E 07 8C 18 E 9 7 1 2C 8B FD F8 F8 00 00 00 00 13 63 6F 6C 72
这是我从上面理解的:
00 00 00 38
avcC 原子的大小
61 76 63 43
avcC 签名
01
配置版本
64
AVCProfileIndication
00
profile_compatibility
1F
AVCLevelIndication
FF
111111b + lengthSizeMinusOne
E1
111b + numOfSequenceParameterSets(在本例中为 1 SPS)
00 1C
SPS 长度(在本例中为 28 字节)
67 64 00 1F AC D9 80 50 05 BB 01 6A 02 02 02 80 00 00 03 00 80 00 00 1E 07 8C 18 CD
SPS 数据(如上 28 字节)
01
numOfPictureParameterSets(在本例中为 1 PPS)
00 05
PPS 长度
这就是问题的开始。根据前面字节给出的 PPS 长度,接下来的 5 个字节应该是 PPS 数据:68 E9 7B 2C 8B
但是根据 avcC 头,原子的总长度是 56 个字节(0x38
),这意味着应该包括以下 4 个字节:FD F8 F8 00
但问题是 PPS 长度为 5 个字节(0x05
)。那么这最后 4 个字节到底是什么?
然后遵循colr
原子的标题:
00 00 00 13
colr原子的大小
63 6F 6C 72
颜色签名
我已经检查过,长度确实是 19 个字节(0x13
)。
问题在于 avcC 原子和我正在分析的特定 mp4 样本(我也检查了其他样本,但它们没有这种特性)。
您可以在此处找到示例。
编辑
mp4info
Bento4 套件中的工具将以下内容报告为 avcC 原子的大小:8+48
并mp4dump
报告:
AVC SPS: [6764001facd9805005bb016a02020280000003008000001e078c18cd]
AVC PPS: [68e97b2c8b]
因此,它根据在 avcC 标头中找到的内容正确地将原子的总大小报告为 56 字节(0x38),但 SPS/PPS 数据的分析方式与上述相同。我仍然不明白最后 4 个字节是什么或它们属于哪里。
解决方案
我没有得到任何答案,但幸运的是更仔细地阅读ISO 14496-15
解决了这个问题:
if( profile_idc == 100 || profile_idc == 110 ||
profile_idc == 122 || profile_idc == 144 )
{
bit(6) reserved = ‘111111’b;
unsigned int(2) chroma_format;
bit(5) reserved = ‘11111’b;
unsigned int(3) bit_depth_luma_minus8;
bit(5) reserved = ‘11111’b;
unsigned int(3) bit_depth_chroma_minus8;
unsigned int(8) numOfSequenceParameterSetExt;
for (i=0; i< numOfSequenceParameterSetExt; i++) {
unsigned int(16) sequenceParameterSetExtLength;
bit(8*sequenceParameterSetExtLength) sequenceParameterSetExtNALUnit;
}
}
显然,根据所使用的配置文件,avcC atom 的末尾可能存在 4+ 个字节的序列。在我上面的示例中,配置文件是 100 ( 0x64
),因此它符合标准。所以最后4个字节是:
FD
=111111
保留位,剩余01
表示色度二次采样 4:2:0
F8
=11111
保留位,剩余000
表示亮度位深度为 8
F8
=11111
保留位,剩余000
表示色度位深度为 8
00
= 零 SPS 扩展
推荐阅读
- flutter - Flutter 的深色模式颜色
- vb.net - 使用资源中的 .txt 文件并将随机行复制到文本框
- javascript - localhost 不为我使用的路由器和控制器输出 JSON
- python - 错误:指定“socksProxy”需要一个整数作为“socksVersion”,在任何地方都找不到
- python - 无法在 Docker 中连接 NoSQLClient
- python-3.x - 在 macOS 10.14.6 上的 Python 3.7.4 中导入 ssl 时出错
- python - 如何使用正则表达式从以下文本中提取年份?
- xml - 在 .CSV 文件中为 XML 解析创建 XSL
- r - 如何在不干扰刚刚转换的变量的情况下替换变量?
- dart - 我可以在 Dart 中的任何类上使用扩展方法吗?