【发布时间】:2014-06-24 08:55:13
【问题描述】:
我需要对 H264 NAL 单元分隔符前缀(00 00 00 01 和 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 和00 00 01 前缀之间的区别?查看Chromium code 似乎第一个单位以及 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 尺寸是否固定?如果是这样,我可以在寻找下一个前缀时直接跳到单元的末尾。
希望有这方面经验的朋友可以对以上问题发表意见。
【问题讨论】:
标签: video-streaming h.264 rtp video-encoding