视频编码(H264概述)

一视频编码介绍
1.1视频压缩编码的目标
1)保证压缩比例
2)保证恢复的质量
3)易实现,低成本,可靠性web

1.2压缩的出发点(可行性)
1)时间相关性
在一组视频序列中,相邻相邻两帧只有极少的不一样之处,这即是时间相关性。
2)空间相关性
在同一帧中,相邻象素之间有很大的相关性,两象素越近,侧相关性越强。数组

根据采用的信源的模型分类:
1)基于波形的编码
若是采用“一幅图像由许多象素构成”的信源模型,这种信源模型的参数就是象素的亮度和色度的幅度值,对这些参数进行编码的技术即为基于波形编码。缓存

2)基于内容的编码
若是采用一个份量有几个物体构成的信源模型,这种信源模型的参数事各个物体的形状,纹理,运动,对这些参数进行编码的技术就是基于内容的编码。网络

h264应用可分为3个级别:
1)基本档次:(简单版本,应用面广 ,支持帧内和帧间编码,基于可变程度的熵编码.)
应用领域:视频会话,会议电视,无线通讯等实时通讯.
2)主要档次:(采用了多项提升图像质量和增长压缩比的技术措施,支持隔行视频,支持基于上下文的自适应的算术编码.)
应用领域: 数字广播与数字视频存储
3)扩展档次:应用领域:可用于各类网络的视频流传输,视频点播框架

二视频编码的原理
2.1一个图像或者一个视频序列进行压缩,产生码流。
对图像的处理便是:帧内预测编码
其预测值P,是由已编码的图像作参考,经运动补偿获得的。预测图像P和当前帧Fn相减,获得两图像的残差值Dn,Dn在通过转换T,量化Q,去处空间冗余,获得系数X,将X重排(使数据更加紧凑),熵编码(加入运动矢量。。。一些图像相关得信息),获得nal数据。
对视频序列的处理:帧间预测编码
预测值P,是由当前片中,己编码的宏块预测获得的(亮度4×4或者16×16预测,色度8×8预测)。当前待处理的块,减去预测值P,得残差值Dn,Dn在通过转换T,量化Q,获得系数X,将X重排(使数据更加紧凑),熵编码,获得nal数据svg

2.2场、帧、图像
场:隔行扫描的图像,偶数行成为顶场行。奇数行成为底场行。
全部顶场行称为顶场。全部底场行称为底场.
帧:逐行扫描的图像
图像:场和帧均可认为是图像.性能

2.3宏块、片
宏块(MB):一个宏块由一个16×16亮度块、一个8×8Cb和一个8×8Cr组成
片(slice):一个图像能够划分红一个或多个片,一个片由一个或多个宏块组成。编码

三H264结构和应用设计

H.264从框架结构上将NAL与VCL分离,主要有两个目的:
其一,能够定义VCL视频压缩处理与NAL网络传输机制的接口,这样容许视频编码层VCL的设计能够在不一样的处理器平台进行移植,而与NAL层的数据封装格式无关;
其二,VCL和NAL都被设计成工做于不一样的传输环境,异构的网络环境并不须要对VCL比特流进行重构和重编码。code

3.1 H264的编码格式
h264的功能分为两层,视频编码层(VCL)和网络提取层(NAL)
VCL功能是进行视频编解码,包括运动补偿预测,变换编码和熵编码等功能;
NAL用于采用适当的格式对VCL视频数据进行封装打包

1)VCL数据即被压缩编码后的视频数据序列。
在VCL数据要封装到NAL单元中以后,才能够用来传输或存储。

2)NAL单元格式
NAL单元由1字节的头,3个定长的字段和一个字节数不定的编码段组成。
头标的语法:NALU类型(5bit)、重要性指示位(2bit)、禁止位(1bit)。
NALU类型:1~12由H.264使用,24~31由H.264之外的应用使用。
重要性指示:标志该NAL单元用于重建时的重要性,值越大,越重要。
禁止位:网络发现NAL单元有比特错误时可设置该比特为1,以便接收方丢掉该单元
Nal头
Rbsp
Nal头
Rbsp
Nal头
Rbsp

(1)NAL Units:视频数据封装在整数字节的NALU中,它的第一个字节标志该单元中数据的类型。H.264定义了两种封装格式。基于包交换的网络(如H.323系统)可使用RTP封装格式封装NALU。而另一些系统可能要求将NALU做为顺序比特流传送,为此H.264定义了一种比特流格式的传输机制,使用start_code_prefix将NALU封装起来,从而肯定NAL边界。

(2)参数集:以往视频编解码标准中GOB\GOP\图像等头信息是相当重要的,包含这些信息的包的丢失常致使与这些信息相关的图像不能解码。为此H.264将这些不多变化而且对大量VCL NALU起做用的信息放在参数集中传送。参数集分为两种,即序列参数集和图像参数集。为适应多种网络环境,参数集能够带内传送,也能够采用带外方式传送。
序列的参数集(SPS):包括了一个图像序列的全部信息,
图像的参数集(PPS):包括了一个图像全部片的信息。

3.2 H264的网络传输
H.264可以在基于RTP/UDP/IP、H.323/M、MPEG-2传输和H.320协议的网络中使用
H.264的RTP封装参考RFC 3550,载荷类型(PT)域未做规定

3.3数据的划分
一般状况下,一个宏块的数据是存放在一块儿而组成片的,数据划分使得一个片中的宏块数据从新组合,把宏块语义相关的数据组成一个划分,由划分来组装片。在H.264中有三种不一样的数据划分。
(1)头信息划分:包含片中宏块的类型,量化参数和运动矢量,是片中最重要的信息。
(2)帧内信息划分:包含帧内CBPs和帧内系数,帧内信息能够阻止错误的蔓延。
(3)帧间信息划分:包含帧间CBPs和帧间系数,一般比前两个划分要大得多。
帧内信息划分结合头信息解出帧内宏块,帧间信息划分结合头信息解出帧间宏块。帧间信息划分的重要性最低,对重同步没有贡献。当使用数据划分时,片中的数据根据其类型被保存到不一样的缓存,同时片的大小也要调整,使得片中最大的划分小于MTU尺寸。
解码端若得到全部的划分,就能够完整重构片;解码端若发现帧内信息或帧间信息划分丢失,可用的头信息仍然有很好的错误恢复性能。这是由于宏块类型和宏块的运动矢量含有宏块的基本特征。

3.4灵活的宏块次序(FMO)
经过设置宏块次序映射表(MBAmap)来任意地指配宏块到不一样的片组,FMO模式打乱了原宏块顺序,下降了编码效率,增长了时延,但加强了抗误码性能。FMO模式划分图像的模式各类各样,重要的有棋盘模式、矩形模式等。固然FMO模式也可使一帧中的宏块顺序分割,使得分割后的片的大小小于无线网络的MTU尺寸。通过FMO模式分割后的图像数据分开进行传输,以棋盘模式为例,当一个片组的数据丢失时可用另外一个片组的数据(包含丢失宏块的相邻宏块信息)进行错误掩盖。实验数据显示,当丢失率为(视频会议应用时)10%时,经错误掩盖后的图像仍然有很高的质量。

四 H264的网络传输
NAL支持众多基于包的有线/无线通讯网络,诸如H.320、MPEG-2和RTP/IP等。但目前,绝大部分的视频应用所采用的网络协议层次是RTP/UDP/IP,所以在下面的描述中主要基于这个传输框架。下面首先分析NAL层的基本处理单元NALU以及它的网络封装、分割和合并的方法。
4.1. NAL单元
每一个NAL单元是一个必定语法元素的可变长字节字符串,包括包含一个字节的头信息(用来表示数据类型),以及若干整数字节的负荷数据。一个NAL单元能够携带一个编码片、A/B/C型数据分割或一个序列或图像参数集。
NAL单元按RTP序列号按序传送。其中,T为负荷数据类型,占5bit;R为重要性指示位,占2个bit;最后的F为禁止位,占1bit。具体以下:
(1)NALU类型位
能够表示NALU的32种不一样类型特征,类型1~12是H.264定义的,类型24~31是用于H.264之外的,RTP负荷规范使用这其中的一些值来定义包聚合和分裂,其余值为H.264保留。
(2)重要性指示位
用于在重构过程当中标记一个NAL单元的重要性,值越大,越重要。值为0表示这个NAL单元没有用于预测,所以可被解码器抛弃而不会有错误扩散;值高于0表示此NAL单元要用于无漂移重构,且值越高,对此NAL单元丢失的影响越大。
(3)禁止位
编码中默认值为0,当网络识别此单元中存在比特错误时,可将其设为1,以便接收方丢掉该单元,主要用于适应不一样种类的网络环境(好比有线无线相结合的环境)。例如对于从无线到有线的网关,一边是无线的非IP环境,一边是有线网络的无比特错误的环境。假设一个NAL单元到达无线那边时,校验和检测失败,网关能够选择从NAL流中去掉这个NAL单元,也能够把已知被破坏的NAL单元前传给接收端。在这种状况下,智能的解码器将尝试重构这个NAL单元(已知它可能包含比特错误)。而非智能的解码器将简单地抛弃这个NAL单元。NAL单元结构规定了用于面向分组或用于流的传输子系统的通用格式。在H.320和MPEG-2系统中,NAL单元的流应该在NAL单元边界内,每一个NAL单元前加一个3字节的起始前缀码。在分组传输系统中,NAL单元由系统的传输规程肯定帧界,所以不须要上述的起始前缀码。一组NAL单元被称为一个接入单元,定界后加上定时信息(SEI),造成基本编码图像。该基本编码图像(PCP)由一组已编码的NAL单元组成,其后是冗余编码图像(RCP),它是PCP同一视频图像的冗余表示,用于解码中PCP丢失状况下恢复信息。若是该编码视频图像是编码视频序列的最后一幅图像,应出现序列NAL单元的end,表示该序列结束。一个图像序列只有一个序列参数组,并被独立解码。若是该编码图像是整个NAL单元流的最后一幅图像,则应出现流的end。
H.264采用上述严格的接入单元,不只使H.264可自适应于多种网络,并且进一步提升其抗误码能力。序列号的设置可发现丢的是哪个VCL单元,冗余编码图像使得即便基本编码图像丢失,仍可获得较“粗糙”的图像。

4.2. H.264中的RTP
上面阐述了NAL单元的结构和实现,这里要详细讨论RTP的载荷规范和抗误码性能。RTP可经过发送冗余信息来减小接收端的丢包率,会增长时延,与冗余片不一样的是它增长的冗余信息是个别重点信息的备份,适合于非平等保护机制。相应的多媒体传输规范有:
(1)分组复制屡次重发,发送端对最重要的比特信息分组进行复制重发,使得保证接收端能至少正确接收到一次,同时接收端要丢弃已经正确接收的分组的多余备份。
(2)基于分组的前向纠错,对被保护的分组进行异或运算,将运算结果做为冗余信息发送到接收方。因为时延,不用于对话型应用,可用于流媒体。
(3)音频冗余编码,可保护包括视频在内的任何数据流。每一个分组由头标、载荷以及前一分组的载荷组成,H.264中可与数据分割一块儿使用。

RTP的封装规范总结以下:
(1)额外开销要少,使MTU尺寸在100~64千字节范围均可以;
(2)易于区分分组的重要性,而没必要对分组内的数据解码;
(3)载荷规范应当保证不用解码就可识别因为其余比特丢失而形成的分组不可解码;
(4)支持将NALU分割成多个RTP分组;
(5)支持将多个NALU聚集在一个RTP分组中。

H.264采用了简单打包的方案,即一个RTP分组里放入一个NALU,将NALU(包括同时做为载荷头标的NALU头)放入RTP的载荷中,设置RTP头标值。理想状况下,VCL不会产生超过MTU尺寸的NAL单元,来避免IP层的分拆。在接收端,经过RTP序列信息识别复制包并丢弃,取出有效RTP包里的NAL单元。基本档次和扩展档次容许片的无序解码,这样在抖动缓存中就没必要对包从新排序。在使用主档次时(不容许片的乱序),要经过RTP序列信息来对包从新排序,解码顺序号(DON)的概念现正在IETF的讨论中。 存在以下状况,例如当使用内容预编码时,编码器不了解底层网络的MTU大小,将产生许多大于MTU尺寸的NALU。这就须要涉及NALU的分割和合并。 (1)NALU的分割 虽然IP层的分割可使数据块小于64千字节,但没法在应用层实现保护,从而下降了非平等保护方案的效果。因为UDP数据包小于64千字节,并且一个片的长度对某些应用场合来讲过小,因此应用层打包是RTP打包方案的一部分。目前的拆分方案正在IETF的讨论之中,大体具备如下特色:①NALU的分块以按RTP次序号升序传输;②可以标记第一个和最后一个NALU分块;③能够检测丢失的分块。 (2)NALU的合并 一些NALU如SEI、参数集等很是小,将它们合并在一块儿有利于减小头标开销。现有的两种集合分组:①单一时间集合分组(STAP),按时间戳进行组合,通常用于低时延环境;②多时间集合分组(MTAP),不一样时间戳也能够组合,通常用于高时延环境,好比流应用