h264码流结构分析(一)

h264视频编码标准中,整个想系统架构框架两层:

视频编码层面VCL:video coding layer

网络抽象层面NAL:network abstract layer

VCL负责有效表示视频数据的内容,而NAL负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输;

VCL:块、宏块及片的语法级别的定义

NAL:片级以上的语法级别(SPS、PPS、I帧、P帧、B帧等)

VCL是可以看成实际的编码层,将所有视频数据进行编码,包括运动估计、运行补偿、变换编码和熵编码等,最后的输出即为被压缩编码的视频数据 序列;

NAL层是将VCL已编码的数据进行打包处理,即VCL的数据要封装在NAL单元中,才可以用来传输或存储;




1、NAL单元格式:

NAL是由一定语法元素组成的可变长字符串组成,包括一个字节的头信息和称为RBSP(原始字节序列负载、Raw Byte Sequence Payload)组成;而RBSP是由原始数据比特流(SODB,String Of Data Bits)加上rbsp_trailing_bits得来的,其中,SODB就是h.264编码之后 的原始码流,rbsp_trailing_bits的作用是为了使码流按字节对齐。

NAL头信息RBSPNAL头信息RBSPNAL头信息RBSP......................................

2、NAL头信息包括3个固定的字段:

禁止位即forbidden_zero_bit:占1个比特

重要信息指示位即nal_ref_idc:占2个比特

NAL单元类型即nal_unit_type:占5个比特


禁止位是用来表示NAL包是否出现比特错误,如果出错则置1,否则置0;

重要信息指示位表示NAL的优先级,取值范围为0~3,取值越大,表示当前NAL越重要,需要优先受到保护;如果当前NAL是属于参考帧的片,或是序列参数集SPS、图像参数集PPS这些重要的单位时,则本句法元素必须大于0;

NAL单元类型:共有32种,1~12种由h264使用,13~23为保留类型,24~31为未指定类型;

0:未规定
1:非IDR图像中不采用数据划分的片段
2:非IDR图像中A类数据划分片段
3:非IDR图像中B类数据划分片段
4:非IDR图像中C类数据划分片段
5:IDR图像的片段
6:补充增强信息 SEI
7:序列参数集SPS
8:图像参数集PPS
9:分割符
10:序列结束符
11:流结束符
12:填充数据
13 – 23:保留
24 – 31:未规定


3、H264标准对送到解码器的NAL单元顺序是有严格要求的,如果NAL单元的顺序是混乱的,必须将其重新依照规范组织后送入解码器,否则解码器不能正确解码。

             1)序列参数集SPS的NAL单元必须在传送所有以此参数集为参考的的其他NAL单元之前传送,不过允许这些NAL单元中间出现重复的序列参数集NAL单元;所谓重复的详细解释为:序列参数集NAL单元都有 专门的标识,如果两个序列参数集NAL单元的标识相同,就可以认为后一个只不过是前一个的拷贝,而非新的的序列参数集。

            2)图像参数集PPS的NAL单元必须在所有以此参数集为参考的其他NAL单元之前,不过允许这些NAL单元中间出现重复的图像参数集NAL单元,这一点和上述的序列参数集NAL单元是相同的

           3)不同基本编码图像中片段slice单元和数据划分片段data partition单元在顺序上不可以相互交叉,即不属于某一个基本编码图像的一系列片段slice单元和数据划分片段data partition单元中忽然出现另一个基本编码图像的片段slice单元片段和数据划分片段data partition单元。

          4)参考图像的影响:如果一幅图像以另一幅图像为参考,则属于前者的所有片段(slice)单元和数据划分片段(data partition)单元必须在属于后者的片段和数据划分片段之后,无论是基本编码图像还是冗余编码图像都必须遵守这个规则 
         5)基本编码图像的所有片段(slice)单元和数据划分片段(data partition)单元必须在属于相应冗余编码图像的片段(slice)单元和数据划分片段(data partition)单元之前。 
        6)如果数据流中出现了连续的无参考基本编码图像,则图像序号小的在前面。 
        7)如果arbitrary_slice_order_allowed_flag置为1,一个基本编码图像中的片段(slice)单元和数据划分片段(data partition)单元的顺序是任意的,如果arbitrary_slice_order_allowed_flag置为零,则要按照片段中第一个宏块的位置来确定片段的顺序,若使用数据划分,则A类数据划分片段在B类数据划分片段之前,B类数据划分片段在C类数据划分片段之前,而且对应不同片段的数据划分片段不能相互交叉,也不能与没有数据划分的片段相互交叉。 
        8)如果存在SEI(补充增强信息) 单元的话,它必须在它所对应的基本编码图像的片段(slice)单元和数据划分片段(data partition)单元之前,并同时必须紧接在上一个基本编码图像的所有片段(slice)单元和数据划分片段(data partition)单元后边。假如SEI属于多个基本编码图像,其顺序仅以第一个基本编码图像为参照。 
        9)如果存在图像分割符的话,它必须在所有SEI 单元、基本编码图像的所有片段slice)单元和数据划分片段(data partition)单元之前,并且紧接着上一个基本编码图像那些NAL单元。 
        10.如果存在序列结束符,且序列结束符后还有图像,则该图像必须是IDR(即时解码器刷新)图像。序列结束符的位置应当在属于这个IDR图像的分割符、SEI 单元等数据之前,且紧接着前面那些图像的NAL单元。如果序列结束符后没有图像了,那么它的就在比特流中所有图像数据之后。 
      11)流结束符在比特流中的最后。



4、
































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值