【问题标题】:H264 NAL unit prefixesH264 NAL 单元前缀
【发布时间】:2014-06-24 08:55:13
【问题描述】:

我需要对 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 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


    【解决方案1】:

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

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

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

    • nal_unit() 中的 nal_unit_type 等于 7(序列参数集)或 8(图片参数集)
    • 字节流 NAL 单元语法结构包含按 7.4.1.2.3 小节规定的解码顺序访问单元的第一个 NAL 单元。

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2018-10-02
      • 2018-12-18
      • 1970-01-01
      • 2015-11-02
      • 2010-12-13
      相关资源
      最近更新 更多