我需要对 H264 NAL 单位分隔符前缀进行一些澄清(00 00 00 01
and 00 00 01
),我正在使用 Intel Media SDK 生成 H264 并将其打包到 RTP 中。问题是到目前为止我只是在寻找00 00 00 01
作为单位分隔符,基本上只能在比特流中找到 AUD、SPS、PPS 和 SEI 单位。查看内存,我发现 SEI 之后有一个字节序列00 00 01 25
这可能是 IDR 单元的开始,但由于缺少零字节,我的搜索算法没有检测到它。任何人都可以澄清之间的区别00 00 00 01
and 00 00 01
前缀?看着铬代码似乎第一个单位以及 AUD、SPS、PPS 和 SEI 都有一个额外的零:
if (first_nal_in_this_access_unit ||
IsAccessUnitBoundaryNal(nal_unit_type)) {
output_size += 1; // Extra zero_byte for these nal units
first_nal_in_this_access_unit = false;
}
...
static bool IsAccessUnitBoundaryNal(int nal_unit_type) {
// Check if this packet marks access unit boundary by checking the
// packet type.
if (nal_unit_type == 6 || // Supplemental enhancement information
nal_unit_type == 7 || // Picture parameter set
nal_unit_type == 8 || // Sequence parameter set
nal_unit_type == 9 || // Access unit delimiter
(nal_unit_type >= 14 && nal_unit_type <= 18)) { // Reserved types
return true;
}
return false;
}
1)我假设我应该查找两个前缀,但后来我明白我需要检查下一个 NAL 单元的类型,以便了解当前单元的长度(了解前缀是 3 还是 4 个字节)并且不消耗可能是前一个 NAL 单元末尾的零字节作为前缀)。
2) PPS、SPS 和 SEI 大小是固定的吗?如果是这样,我在寻找下一个前缀时可以跳到单元的末尾。
我希望有更多这方面经验的人可以评论以上问题。
From H.264 规范、B.1.2 字节流NAL单元语义:
Zero_byte 是等于 0x00 的单个字节。
当满足以下任一条件时,将出现zero_byte 语法元素。
- nal_unit()中的nal_unit_type等于7(序列参数集)或8(图片参数集)
- 字节流 NAL 单元语法结构包含按解码顺序排列的访问单元的第一个 NAL 单元,如子条款 7.4.1.2.3 所指定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)