H264 NAL单元前缀

6
我需要对H264 NAL单元分隔符前缀(00 00 00 0100 00 01)进行一些澄清,我正在使用Intel Media SDK生成H264并将其打包到RTP中。问题在于,到目前为止,我只寻找了00 00 00 01作为单元分隔符,并且基本上只能在比特流中找到AUD、SPS、PPS和SEI单元。查看内存后,我发现在SEI之后有一个字节序列00 00 01 25,可能是IDR单元的开头,但由于缺少零字节,我的搜索算法未能检测到它。有人能澄清一下00 00 00 0100 00 01前缀之间的区别吗?从Chromium代码来看,第一个单元以及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的大小是否固定?如果是,那么在查找下一个前缀时,我可以直接跳到单元的末尾。

希望有更多经验的人能够就上述问题发表评论。

1个回答

9

来自H.264规范,B.1.2字节流NAL单元语义:

enter image description here

zero_byte是一个等于0x00的单字节。

当满足以下任何条件时,zero_byte语法元素应当出现:

  • nal_unit( )中的nal_unit_type等于7(序列参数集)或8(图像参数集)
  • 字节流NAL单元语法结构包含访问单元中按解码顺序指定的第一个NAL单元,如子句7.4.1.2.3所述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接