H.264码流结构

H264的码流的打包方式有两种,一种为annex-b byte stream format 的格式,这个是绝大部分编码器的默认输出格式,就是每个帧的开头的3~4个字节是H264的start_code,0x00000001或者0x000001。
另一种是原始的NAL打包格式,就是开始的若干字节(1,2,4字节)是NAL的长度,而不是start_code,此时必须借助某个全局的数据来获得编 码器的profile,level,PPS,SPS等信息才可以解码。

H.264的码流结构

在具体讲述NAL Unit前,有必要先了解一下H.264的码流结构,在经过编码后的H.264的码流如图9-15所示。从图中可以看出,H.264码流是由一个个的NAL Unit组成的,其中SPS、PPS、IDR和Slice是NAL Unit某种类型的数据。

NAL单元

一个原始的H.264的NAL单元常由[StartCode]​[NALU Header]​[NALU Payload]3部分组成,其中StartCode用于标示这是一个NAL单元的开始,必须是00 00 00 01或00 00 01。

H.264的主要目标是为了有高的视频压缩比和良好的网络亲和性,为了达到这两个目标,H.264的解决方案是将系统框架分为两层,分别是视频编码层(VCL)和网络抽象层(NAL)。VCL层是对核心算法引擎、块、宏块及片的语法级别的定义,负责有效表示视频数据的内容,最终输出编码完的数据SODB。NAL层定义了片级以上的语法级别(如序SPS和PPS,主要针对网络传输)​,负责以网络所要求的恰当方式去格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。NAL层将SODB打包成RBSP,然后加上NAL头组成一个NALU,具体NAL Unit的组成也会在后面详细讲述。SODB与RBSP关联的具体结构如图9-12所示。

网络提取层定义了片级以上的语法级别,同时支持以下功能:独立片解码,保证起始码唯一,SEI及流格式编码数据传送。VCL数据在网络上传输或者存储到磁盘上之前,需要先被封装或映射进NALU中,每个NAL Unit之前需要添加StartCodePrefix,最后形成H.264码流,H.264码流分层结构如图9-14所示。

1.原始数据比特串(String Of Data Bit,SODB)是由编码器直接输出的原始编码数据,即VCL数据,是编码后的原始数据。

2.原始字节序列载荷(Raw Byte Sequence Payload,RBSP)在SODB的后面增加了若干结尾比特(RBSP trailing bits,1个为1的比特和若干为0的比特)​,以使SODB的长度为整数字节。

3.扩展字节序列载荷(Extension Byte Sequence Payload,EBSP)在RBSP的基础上增加了仿校验字节(0x03)

4.NAL单元(NAL Unit,NALU)由1个NAL头(NAL Header)和1个RBSP(或EBSP)组成

仿校验字节(0x03)

H.264规定,当检测到0x000000时,也可以表示当前NALU的结束。这样就会产生一个问题,如果在NALU的内部出现了0x000001或0x000000,这时该怎么办?增加仿校验字节的方法是在将NALU添加到H.264码流上时,需要在每个NALU之前添加开始码(StartCodePrefix)。添加StartCodePrefix有一定的规则,如果该NALU对应的Slice为一帧的开始,则StartCodePrefix为0x00 0x00 0x00 0x01这4字节,否则StartCodePrefix为0x00 0x00 0x01这3字节。为了使NALU主体中不包含与开始码相冲突的字节序列,在编码时,每当遇到两字节连续为0x00时,就在这两字节后面插入一字节0x03。解码时将0x03去掉,称为脱壳操作,操作流程如图9-13所示。

VCL层编码后的视频帧有可能是I帧或B帧或P帧,这些帧也可能属于不同的序列之中,同一序列还有相应的序列参数集与图片参数集。综上所述,想要准确无误地对视频进行解码,除了需要VCL层编码出来的视频帧数据,同时还需要传输SPS和PPS等,所以RBSP不单纯只保存I帧或B帧或P帧的数据编码信息,还有其他信息也可能出现在里面。NAL Unit是实际视频数据传输的基本单元,NALU头用来标识后面RBSP是什么类型的数据,同时记录RBSP数据是否会被其他帧参考及网络传输是否有错误,所以针对NAL头和RBSP的作用及结构与所承载的数据需要做

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值