• H.264 NAL unit start code and NAL types


    H.264 NAL unit start code and NAL types

         

    在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。NAL占一个字节。

        NAL单元(NALU):NAL的基本语法结构,它包含一个字节的头信息和一系列来自VCL的称为原始字节序列载荷(RBSP)的字节流。 数据流是储存在介质上时: 每个NALU 前添加起始码:0x00000001(或者0x000001),用来指示一个 NALU的起始和终止位置。我们平时的每帧数据就是一个NAL单元(这个需要再确认)(SPS与PPS除外)。

        编码器将每个NAL各自独立、完整地放入一个分组,因为分组都有头部,解码器可以方便地检测出NAL的分界,并依次取出NAL进行解码。每个NAL前有一个起始码 0x00 00 01(或者0x00 00 00 01),解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束。同时H.264规定,当检测到0x000000时,也可以表征当前NAL的结束。那么NAL中数据出现0x000001或0x000000时怎么办?H.264引入了防止竞争机制,如果编码器检测到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样:

    0x000000->0x00000300
    0x000001->0x00000301
    0x000002->0x00000302
    0x000003->0x00000303
    解码器检测到0x000003时,把03抛弃,恢复原始数据(脱壳操作)。解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码。

    NALU头由一个字节组成, 它的语法如下:
          +---------------+
          |0|1|2|3|4|5|6|7|
          +-+-+-+-+-+-+-+-+
          |F|NRI|  Type   |
          +---------------+
    F: 1 个比特.
      forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.
    NRI: 2 个比特.
      nal_ref_idc. 取 00 ~ 11, 似乎指示这个 NALU 的重要性, 如 00 的 NALU 解码器可以丢弃它而不影响图像的回放. 不过一般情况下不太关心
    这个属性.
    Type: 5 个比特.
     nal_unit_type. 这个 NALU 单元的类型. 简述如下:
    0    没有定义
    1     一个非IDR图像的编码条带 (bp帧)
    slice_layer_without_partitioning_rbsp( )     
    2     编码条带数据分割块A
    slice_data_partition_a_layer_rbsp( )     
    3     编码条带数据分割块B
    slice_data_partition_b_layer_rbsp( )     
    4     编码条带数据分割块C
    slice_data_partition_c_layer_rbsp( )     
    5     IDR图像的编码条带 (i帧)
    slice_layer_without_partitioning_rbsp( )     
    6     辅助增强信息 (SEI)
    sei_rbsp( )     
    7     序列参数集 (sps帧)
    seq_parameter_set_rbsp( )     
    8     图像参数集
    pic_parameter_set_rbsp( pps帧)     
    9     访问单元分隔符
    access_unit_delimiter_rbsp( )     
    10     序列结尾
    end_of_seq_rbsp( )     
    11     流结尾
    end_of_stream_rbsp( )     
    12     填充数据
    filler_data_rbsp( )     
    13     序列参数集扩展
    seq_parameter_set_extension_rbsp( )     
    14...18     保留     
    19     未分割的辅助编码图像的编码条带
    slice_layer_without_partitioning_rbsp( )     
    20...23     保留     
    24    STAP-A   单一时间的组合包
    25    STAP-B   单一时间的组合包
    26    MTAP16   多个时间的组合包
    27    MTAP24   多个时间的组合包
    28    FU-A     分片的单元
    29    FU-B     分片的单元
    30-31 没有定义

    当遇到 00 00 00 01 67表示sps帧

    当遇到 00 00 00 01 68 表示pps帧

    from: http://blog.csdn.net/yuanbinquan/article/details/60148345

  • 相关阅读:
    Linux下文件的压缩和解压
    Env: Linux下Source Insight安装
    [uart]2.tty和uart的函数调用流程
    [uart]stty命令使用
    腾讯云的云数据库MYSQL配置
    MySQL分支Percona
    MYSQL的历史
    MYSQL的价格
    mysql之event
    Linux下设置网卡静态ip
  • 原文地址:https://www.cnblogs.com/aspirs/p/7191098.html
Copyright © 2020-2023  润新知