ITU-T H.264/MPEG-4 AVC编解码原理介绍

本文档适合基本了解数字图像处理的初学者,仅用于研究交流,由于资料来源较多,只能尽量在相关章节注明出处。

转载本文请注明出处http://blog.csdn.net/chinadragon76/article/details/22408727。

希望达到的目的:

  • 为查阅或正确理解ISO/IEC 14496-10标准文档做必要的引导和铺垫;
  • 对编码数据复用技术(本文Annex A)有初步了解;
  • 对码率控制(本文8小节)及错误隐藏(本文9小节)有基本了解。

1. 视频压缩的必要性

  • 使得在不能支持原始非压缩视频传输和存储的环境下能够使用数字视频。

        例如,当前Internet的吞吐速率难以实时处理没有压缩的视频(即使在很低的视频帧率和很小的视频空间分辨率的情况下),一张1.36GB容量的DVD仅能存储不到1分钟相当于电视质量分辨率和帧率的原始视频(216Mbits/s)

  • 视频压缩使得人们能够更有效地使用传输和存储资源。

        如果存在一个高效率的通道,则传输高分辨率的压缩视频或者多个压缩视频要比传输单独一个底分辨率的未压缩的视频更具吸引力。虽然存储和传输容量不断提高,但在未来很长时间里,压缩仍然是多媒体服务的核心内容。

2.H.264视频压缩标准特点

      追朔到20世纪90年代,自视频编码标准发布以来,不论是国际标准化组织ISOMPEG-*系列标准还是国际电信联盟ITU-TH.26x系列标准,其编码的基本原理都是相同的,都是用空域预测去掉空间冗余、时域预测去掉时域冗余,最后采取熵编码使得可以用最少的比特数来表示码流(参考本文3.2.1小节,编码概念图)。所不同的是,各种标准采用的具体算法和实现各不相同。

     相比于先前的视频压缩标准,H.264引入了很多先进的技术,包括4×4整数变换、空域内的帧内预测、1/4象素精度的运动估计、多参考帧、多种小块的帧间预测、去除块效应的环路滤波、灵活的slice大小、基于上下文的自适应变长编码CAVLC(Context-based Adaptive Variable Length Coding)和基于上下文的自适应二进制算术编码CABAC (Context-based Adaptive Binary Arithmetic Coding)等。

      进一步可参考维基百科相关描述http://zh.wikipedia.org/wiki/MPEG-4_Part_10

3.原理

3.1 JPEG压缩原理

      RGB图像()伽马校正和缩减取样(Downsampling)分解为YUV区域后,对各区域分别进行平移和DCT转换分离出高频和低频区域,接着对DC/AC系数进行量化(Quantization, 一种低通滤波,是主要的有损运算,量化矩阵的获取来自实验得出的经验值,好的图形图像处理软件有多种各个环境的经验值)过滤区域的高频部分,经熵编码输出最终压缩数据。

ref: http://www.w3.org/Graphics/JPEG/itu-t81.pdf  http://zh.wikipedia.org/zh-cn/JPEG

 

3.2 DPCM/DCT混合编/解码器

DPCM - Differential Pulse Code Modulation

3.2.1 一些基本概念

    1.预测编码:经过压缩编码后传输的并不是像素本身的取样值,而是该取样的预测值和实际值之差。

    2.编码概念图:



可扩展阅读H.264 And MPEG-4 Video Compressionchapter 3. by Iain E. Richardson.THE H.264 ADVANCED VIDEO COMPRESSION STANDARD, 2nd Editionchapter 3.6, by Iain E. Richardson.

 

   3.块效应产生原因与消除算法:主要原因是对基于块的帧内和帧间预测残差的DCT变换系数进行量化的过程相对粗糙,解码时IDCT恢复AC/DC变换系数带有误差,造成图像块边界上视觉不连续;另一个次要原因来自于运动补偿预测。

近年出现的块效应消除算法主要分两类:一类是彻底改变原有编码模式,不采用分块处理方法,例如基于纹理的编码,小波变换编码(high profile)等,另一类是在现有分块压缩编码基础上进行优化和扩展,多采用后处理方式进行图像恢复和增强,例如基于图像恢复的凸集投影法(POCS)和最大后验概率法(MAP)等,基于图像增强的空域滤波和DCT变换域滤波等。(扩展阅读论文《DCT图像压缩方法的改进及其应用》,丛爽等著。)

 
 

3.2.1 编码器


编码器有两条主要的数据流路径:左->右(编码)、右->左(重建)。编码数据流如下:

1.以宏块(16×16亮度区域和相应的色度区域)为单位,对输入视频第nFn进行编码;

2.运动估计函数从参考帧(如上一次重建帧F或子采样后的F)中寻找当前宏块的匹配(相似)区域,该区域和当前宏块的位置偏移即为运动矢量MV

3.根据MV生成运动补偿的预测P16×16区域);

4.用当前宏块减去P生成当前帧的残差宏块Dn

5.将Dn分割为8×84×4的子块,分别进行DCT变换;

6.子块量化(X);

7.子块的DCT系数重排序(Reorder),再进行run-level游程编码(在一个非零的DCT系数前的连续为零的系数的数目被称为run”,而非零DCT系数的绝对值被称为level”)

8.编码后的系数、运动矢量和相关的宏块头信息经过熵编码(无损)后生成压缩比特率。

 

  重建数据流如下:

1.每个量化后的宏块X经过重定比例(rescale)IDCTDCT逆变换)变换生成解码后的残差D'n。由于量化过程不可逆,所以D'n和原宏块Dn并不相同(有失真);

2.残差Dn与运动补偿预测P相加得到重建宏块,所有重建宏块一起得到重建帧Fn

  第nFn编码结束后,其重建帧F'n可以用来作为参考帧,并用于第n+1Fn+1的编码。

  以下是添加帧内预测后的H.264编码器流程图:

                                                                                    H.264编码器流程图

3.2.1 解码器

解码器数据流:

1.熵解码器从压缩比特流中解码出变换系数、运动矢量和宏块头信息;

2.反向run-level游程编码并重排序之后,得到量化的变换域宏块X

3.X经过重定比例(rescale)IDCT变换生成解码后的残差D'n

4.根据解码后的运动矢量,在解码器上一次重构的参考帧F'n-1中找到16×16的匹配区域,作为运动补偿的预测P

5.残差D'nP相加得到重建宏块,所有重建宏块一起得到重建帧F'n

  F'n可以用来显示,也可存储下来作为解下一帧F'n+1的参考帧。

  以下为包含帧内预测的H.264解码器流程图:

                                                                      H.264 解码器流程图


扩展阅读:一份研究报告《H.264/MPEG-4 Advanced Video Coding, by Alexander Hermans, 2012.9.11. 本小节H.264/解码器流程图表来自该文。

 

4.Level(级别)Profile(档次)

4.1 Level(级别)

Level(级别)是用来约束分辨率帧率码率的。

Level

Max macroblocks

Max video bit rate (kbit/s)

Examples for high resolution @ frame rate (max stored frames)

per second

per frame

BP, XP, MP

HiP

Hi10P

Hi422P, Hi444PP

1

1,485

99

64

80

192

256

128×[email protected] (8)
176×[email protected] (4)

1b

1,485

99

128

160

384

512

128×[email protected] (8)
176×[email protected] (4)

1.1

3,000

396

192

240

576

768

176×[email protected] (9)
320×[email protected] (3)
352×[email protected] (2)

1.2

6,000

396

384

480

1,152

1,536

320×[email protected] (7)
352×[email protected] (6)

1.3

11,880

396

768

960

2,304

3,072

320×[email protected] (7)
352×[email protected] (6)

2

11,880

396

2,000

2,500

6,000

8,000

320×[email protected] (7)
352×[email protected] (6)

2.1

19,800

792

4,000

5,000

12,000

16,000

352×[email protected] (7)
352×[email protected] (6)

2.2

20,250

1,620

4,000

5,000

12,000

16,000

352×[email protected](10)
352×[email protected] (7)
720×[email protected] (6)
720×[email protected] (5)

3

40,500

1,620

10,000

12,500

30,000

40,000

352×[email protected] (12)
352×[email protected] (10)
720×[email protected] (6)
720×[email protected] (5)

3.1

108,000

3,600

14,000

17,500

42,000

56,000

720×[email protected] (13)
720×[email protected] (11)
1280×[email protected] (5)

3.2

216,000

5,120

20,000

25,000

60,000

80,000

1,280×[email protected] (5)
1,280×1,[email protected] (4)

4

245,760

8,192

20,000

25,000

60,000

80,000

1,280×[email protected] (9)
1,920×1,[email protected] (4)
2,048×1,[email protected] (4)

4.1

245,760

8,192

50,000

62,500

150,000

200,000

1,280×[email protected] (9)
1,920×1,[email protected] (4)
2,048×1,[email protected] (4)

4.2

522,240

8,704

50,000

62,500

150,000

200,000

1,920×1,[email protected] (4)
2,048×1,[email protected] (4)

5

589,824

22,080

135,000

168,750

405,000

540,000

1,920×1,[email protected] (13)
2,048×1,[email protected] (13)
2,048×1,[email protected] (12)
2,560×1,[email protected] (5)
3,680×1,[email protected] (5)

5.1

983,040

36,864

240,000

300,000

720,000

960,000

1,920×1,[email protected] (16)
4,096×2,[email protected] (5)
4,096×2,[email protected] (5)

5.2

 

 

 

 

 

 

 

其中,BP(Baseline Profile)XP(Extended Profile),MP(Main Profile)HiP(High Profile)表示档次(Profile),见后续说明

据上图可视频压制时判定分辨率、帧率和级别间的关系:

CIF(352×288)分辨率为例,根据分辨率可计算出水平宏块数(PicWidthInMbs)和垂直宏块数(FrameHeightInMbs):

    PicWidthInMbs = ceil(视频宽度 / 16) = ceil(352 / 16) = 22

    FrameHeightInMbs = ceil(视频高度 / 16) = ceil(288 / 16) = 18

 

进而计算每帧宏块数:

      每帧宏块数 水平宏块数×垂直宏块数 22×18 = 396

 

查表知支持每帧宏块数为396的有1.11.21.32.04个级别。

最低级别1.1所允许每秒最大宏块数(Max macroblocks per second)是3000,即可求得帧率为 3000/3967.5(fps)。类似地,1.21.32.0级别支持的帧率也可求得。注意到1.32.0等级最大宏块数是一样的,所以对CIF尺寸视频帧率支持均为30(fps)

 

 

本小节参考和扩展阅读: http://www.cnblogs.com/zyl910/archive/2011/12/08/h264_level.html

http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC 

 

 

4.2 profile(档次)

H.264只支持4个档次(Baseline/Extended/Main/High profile)MPEG-4支持近20个档次

 

H.264 主要Profile 说明:

  • BP(Baseline profile)提供I/P帧,仅支持Progressive(逐行扫描)和CAVLC。多应用于“视频会话”,如可视电话、会议电视、远程教学、视频监控等实时通信领域;
  • XP(Extended profile)提供I/P/B/SP/SI帧,仅支持Progressive和CAVLC。多应用于流媒体领域,如视频点播、基于网络的视频监控等;
  • MP(Main profile)提供I/P/B帧,支持Progressive和Interlaced(隔行扫描),提供CAVLC和CABAC。多应用于数字电视广播、数字视频存储等领域;
  • HiP(High profile)(Fidelity Range Extensions,FRExt)在Main profile基础上新增8*8帧内预测,Custom Quant,Lossless Video Coding,更多YUV格式(4:2:2,4:4:4),像素精度提高到10位或14位。多应用于对高分辨率和高清晰度有特别要求的领域。

 

[cpp] view plain copy
  1. // JM 18.6, AVC Profile IDC definitions  
  2.   
  3. enum {  
  4.   
  5.   FREXT_CAVLC444 = 44,       //!< YUV 4:4:4/14 "CAVLC 4:4:4"  
  6.   
  7.   BASELINE       = 66,       //!< YUV 4:2:0/8  "Baseline"  
  8.   
  9.   MAIN           = 77,       //!< YUV 4:2:0/8  "Main"  
  10.   
  11.   EXTENDED       = 88,       //!< YUV 4:2:0/8  "Extended"  
  12.   
  13.   FREXT_HP       = 100,      //!< YUV 4:2:0/8  "High"  
  14.   
  15.   FREXT_Hi10P    = 110,      //!< YUV 4:2:0/10 "High 10"  
  16.   
  17.   FREXT_Hi422    = 122,      //!< YUV 4:2:2/10 "High 4:2:2"  
  18.   
  19.   FREXT_Hi444    = 244,      //!< YUV 4:4:4/14 "High 4:4:4"  
  20.   
  21.   MULTIVIEW_HIGH = 118,      //!< YUV 4:2:0/8  "Multiview High" - MVC  
  22.   
  23.   STEREO_HIGH    = 128       //!< YUV 4:2:0/8  "Stereo High" - MVC  
  24.   
  25. } ProfileIDC;  


 

5.H.264语法结构特点

H.264 相对以往的视频压缩编码标准来说,在语法结构上有很大的改变,其中最大的改变体现在以下两个方面:

1) 取消帧级语法单元 

H.264 语法中没有 frame_header 之类的语法单元,帧信息全部放在slice_headerSPS(Sequence Parameters set)PPS(Picture parameters set) 中,这样可增强slice 单元解码的独立性,提高码流的抗丢包、抗误码能力。但由于一帧图像可以对应多个 slice,因此解码器无法通过解析类似frame_header的语法来识别码流中的一帧数据。

 

2)引入SPSPPS 等参数集概念

将一个视频序列(iso/iec 14496-10 3.27小节,从IDR(Instantaneous Decoder Refresh)帧开始到下一个IDR 帧之前的数据称为一个视频序列)全部图像的共同特征抽取出来,放在 SPS 语法单元中。一个SPS仅对应一个NALU

将各个图像的典型特征抽取出来,放在PPS 语法单元中。一个PPS仅对应一个NALU

只有视频序列之间才能切换 SPS,即只有IDR 帧的第一个slice 可以切换 SPS

只有图像之间才能切换PPS,即只有每帧图像的第一个slice 才能切换PPS

 

 

从宏观上来说,SPSPPSIDR 帧(包含一个或多个I-Slice)、帧(包含一个或多个P-Slice )、帧(包含一个或多个B-Slice )共同构成典型的H.264 码流结构。除上述典型语法结构外,为了方便传输私有信息,H.264 还定义了 SEI 语法结构。除非编码器和解码器进行特定的语法协商,解码器一般不对 SEI 包进行解析。

 

关于slice:

slice是片(有些资料称为“条带”)的意思,H.264中把图像分成一帧(frame)或两场(field),而帧又可以分成一个或几个片(slices);片由宏块(macro block, MB)组成。宏块是编码处理的基本单元

                                                                                       层次概念图


6.NALU(Network Abstract Layer Unit)

nalu (nal unit)H.264的最高抽象层,H.264 的所有语法结构最终都被封装成nalu 。码流中的nalu单元必须定义合适的分隔符,否则无法区分。H.264 视频压缩标准的附录采用前缀码“00 00 01”作为nalu 的分隔符,可以通过搜索前缀码“00 00 01”来识别一个nalu 

 

编码时每完成一个NAL后,检查是否存在以下连续的四个字节序列,若匹配则向最后一个字节前插入一个’0x03’字节;

  • 0x000000  -->> 0x000000300
  • 0x000001  -->> 0x000000301
  • 0x000002  -->> 0x000000302
  • 0x000003  -->> 0x000000303

对一帧图像的最后一个宏块,先添加结尾停止比特,再检测起始码竞争

解码时取出NALU后,第一件事情就是去’0x03’操作。

6.1 以NALU为处理单元的解码流程

SODB - String of Data Bits

RBSP - Raw Byte Sequence Payload

EBSP - Encapsulation Byte Sequence Packets

                                                                 NALU解码流程图

nalu 有自己的语法元素,但是仅占用一个字节,即nalu 单元除了紧跟前缀码“00 00 01”之后的第一个字节外,其他载荷都是H.264 某种语法结构的有效载荷。nalu_type nalu 最重要的语法元素,它表征nalu  内封装的H.264 语法结构的类型。nalu_type 可以按照以下方式解析: 

nalu_type = first_byte_in_nal & 0x1F  // 这里用first_byte_in_nal 表示nalu 第一个字节。

 

 Nalu头结构(8 bits)

0                   

1

2

3

4

5

6

7

F

NRI

Type

F (1 bit): forbidden_zero_bit. 默认等于 0 ,当识别到比特错误时可置 1 。例如,在一个无比特错误的有线网络和非 IP 协议的无线网络结合的环境里,对于从无线到有线的网关,当一个 NALU 到达无线一边时校验和检测失败,网关可以选择从 NAL 流中去除该 NALU ,也可以将该位置 1 后再传送给有线一端。

NRI(2 bits): nal_ref_idc. nal_unit_type等于6,9,10,1112nal_ref_idc等于0,表示在重构时该类NALU不用于预测,可被解码器抛弃而无错误扩散;大于0且数值越高时,若该NALU丢失对重构的影响就越大。

 

目前类型有:

[cpp] view plain copy
  1. // 摘自JM 18.6 , values for nal_unit_type  
  2.   
  3. typedef enum {  
  4.   
  5.  NALU_TYPE_SLICE    = 1,  // 非IDR帧(图像)的编码条带(片)  
  6.   
  7.  NALU_TYPE_DPA      = 2,  // the coded slice data partitions A  
  8.   
  9.  NALU_TYPE_DPB      = 3,    
  10.   
  11.  NALU_TYPE_DPC      = 4,  
  12.   
  13.  NALU_TYPE_IDR      = 5,  // Instantaneous Decoding Refresh  
  14.   
  15.  NALU_TYPE_SEI      = 6, // Supplemental Enhancement Information, refer to   
  16.   
  17.  NALU_TYPE_SPS      = 7, // Sequence Parameters Set  
  18.   
  19.  NALU_TYPE_PPS      = 8, // Picture Parameters Set  
  20.   
  21.  NALU_TYPE_AUD      = 9,  // Access Unit Delimiter  
  22.   
  23.  NALU_TYPE_EOSEQ    = 10,  // End of one Video Sequence  
  24.   
  25.  NALU_TYPE_EOSTREAM = 11,  // End of the Stream  
  26.   
  27.  NALU_TYPE_FILL     = 12,  // filling bits  
  28.   
  29. #if (MVC_EXTENSION_ENABLE)  
  30.   
  31.  NALU_TYPE_PREFIX   = 14,  
  32.   
  33.  NALU_TYPE_SUB_SPS  = 15,  
  34.   
  35.  NALU_TYPE_SLC_EXT  = 20,  
  36.   
  37.  NALU_TYPE_VDRD     = 24  // View and Dependency Representation Delimiter NAL Unit  
  38.   
  39. #endif  
  40.   
  41. } NaluType;  


 

备注:14496:2010 ANNEX H中定义了MVC扩展,用于支持3D视频和FTV多视点编码

 

详细说明

nal_unit_type

NAL类型

C

0

未使用

 

1

不分区、非IDR的片

2,3,4

2

片分区A,或A型编码条带数据分割块 

2

3

片分区B

3

4

片分区C

4

5

IDR图像中的片

2,3

6

补充增强信息单元(SEI

5

7

序列参数集

0

8

图像参数集

1

9

分界符

6

10

序列结束

7

11

码流结束

8

12

填充

9

13..23

保留

 

24..31

不保留,RTP负荷规范中有用到

 


 

参考RFC 6184, Section 5.2

聚合包(Aggregation Packet):一个RTP包载荷里面聚合了多个NALU,共4个版本:

RTP Aggregation Packet type

Nalu type

the Single-Time Aggregation Packet type A (STAP-A)

24

the Single-Time Aggregation Packet type B (STAP-B)

25

Multi-Time Aggregation Packet(MTAP) with 16-bit offset (MTAP16)

26

Multi-Time Aggregation Packet(MTAP) with 24-bit offset (MTAP24)

27


注意:单个聚合包不限制所容纳的NALU总尺寸,仅限制单个NALU最大尺寸为65535 bytes

 

分裂单元(Fragmentation Unit):一个NALU分裂成多个部分,并分布到多个RTP载荷里,共2个版本:

Fragmentation Unit type

Nalu type

FU-A

28

FU-B

29


6.1 语法结构(for 14496-10 chapter 7)

术语约定:

编码器输出码流中,数据的基本单位是句法元素。每个句法元素由若干比特组成,它表示特定的物理意义,例如:宏块类型、量化参数等。句法表征句法元素的组织结构,语义阐述句法元素的具体含义。规范通过定义句法和语义来规范编解码器的工作流程。

语法是句法元素的组织结构,语法提供判断、循环等必要的描述方法。H.264采用类C语法,具体如下:

1.判断:

if (条件){...}

else {...}

2.循环:

A. do {...} while(条件)

B. while (条件){...}

C. for (初始条件求值) {...}


                                                                  H.264句法概览图



扩展阅读《THE H.264 ADVANCED VIDEO COMPRESSION STANDARD, 2nd Edition》 chapter 5, by ain E. Richardson. 

 

 

6.1 IDR 帧的识别方法

解码器只能从IDR 帧开始才能正常解码,所以播放器为了完成快进、快退、解码通道切换功能时需要识别IDR 帧。H.264 协议虽然没有定义帧语法结构,但可以通过nalu_type来识别IDR 帧。例如,可以从码流中搜索并提取连续存放的若干个nalu_type 等于05 nalu,即可获得一个完整的IDR 帧。一个IDR 帧可以划分为若干个I-Slice,每个I-Slice 对应一个nalu ,也就是说一个IDR帧可以对应多个nalu ,提取时需要保证IDR 帧的完整性。

 

SPS PPS 的搜索方法和IDR 帧相同,但每个 SPS 或者PPS 仅对应一个nalu 

 

帧边界识别方法

H.264 将构成一帧图像所有nalu 的集合称为一个AU(Access Unitiso/iec 14496-10  chapter 3.1),帧边界识别实际上就是识别AU 。因为H.264 取消帧级语法,所以无法简单地从码流中获取AU 。解码器只有在解码的过程中,通过某些语法元素的组合才能判断一帧图像是否结束。(可扩展阅读本文Annex A.)

           

7.GOP(图像组)Reference(参考周期)

  在H.264视频编码序列中,主要有三种编码帧:I帧、P帧、B帧,如下图3.1所示。

  ● I帧即Intra-coded picture(帧内编码图像帧),不参考其他图像帧,只利用本帧的信息进行编码
  ● P帧即Predictive-coded Picture(预测编码图像帧),利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码
  ● B帧即Bidirectionally predicted picture(双向预测编码图像帧),提供最高的压缩比,它既需要之前的图像帧(I帧或P),也需要后来的图像帧(P),采用运动预测的方式进行帧间双向预测编码

  在视频编码序列中,GOPGroup of picture(图像组),指两个I帧之间的距离,Reference(参考周期)指两个P帧之间的距离(如下图)。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧(如下图所示)。

                                        IPB帧示意图

  所以在码率不变的前提下,GOP值越大,PB帧的数量会越多,平均每个IPB帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量。

   需要说明的是,通过减小GOP值来提高图像质量是有限度的,在遇到场景切换的情况时,H.264编码器会自动强制插入一个I帧,此时实际的GOP值被缩短了。另一方面,在一个GOP中,PB帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续PB帧的图像质量,直到下一个GOP开始才有可能得以恢复,所以GOP值也不宜设置过大。

  同时,由于PB帧的复杂度大于I帧,所以过多的PB帧会影响编码效率, 使编码效率降低。另外,过长的GOP还会影响Seek操作的响应速度,由于PB帧是由前面的IP帧预测得到的,所以Seek操作需要直接定位,解码某一个PB帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。

 

关于JM对应部分,论坛上有人议论(待证实):

JM 较低版本中 GOP 的概念很弱,几乎没什么用处。较高版本(可能是从 JM10.0 开始的)中用于B帧的层次化编码结构。要设置 GOP 直接设置 帧数量就可以了。
编码配置文件中的层次化编码参数(JM10.0 中叫做 PyramidCodingJM11.0 以后改名为 HierarchicalCoding)是用来控制是否对一个GOP内的B帧进行层次化编码。

8.码率控制(Rate Control)

对视频通信而言,由于通信信道带宽有限,需对视频编码码率进行控制,来保证编码码流的顺利传输和信道带宽的充分利用。针对不同的应用场合,学者们提出了多种码率控制(Rate Control)策略。其中,实时编码码率控制方法主要有两种:

一种是VM8码率控制算法,用先前宏块编码产生的比特数来预测当前宏块编码产生比特数;由于 VM8 码率控制算法建立的基础是假定相邻帧之间相关程度比较高,当视频序列中场景切换或变化迅速的现象经常出现时, 第一个假设条件将难以满足, 此时算法性能会显著下降。

另一种是TMN8拉格朗日(Lagrangian)最小优化算法,该算法通过视频编码率失真函数来预测当前宏块编码产生的比特数。

码率控制模式分固定码率控制(Constant Bit Control, CBR)和可变码率控制(Variab1e Bit ControlVBR)两种。固定码率控制认为传输速率恒定,按图像复杂度分配码率,如果码率过低,通过填充无用比特来达到期望码率;如果码率过高,则通过提高量化参数来降低码率,达到期望码率。这种方法实现简单,但在场景切换时容易产生马赛克,一般适用于传输信道恒定的情况。可变码率控制是指在保证图像质量的前提下,根据图像复杂度分配码率。这种算法得到的图像质量较好,但实现复杂,一般适用于传输信道经常波动的情况。

 

9.错误定位(Error Location)和错误隐藏(Error Concealment)

在视频传输过程中视频质量会受到受损宏块的影响而导致视频质量下降,为了减小视频传输错误对解码端重建视频质量的影响,必须要在编码端进行一些处理或者是添加一些冗余信息来实现错误定位和错误隐藏,本质上是解决两个问题

1. 解码端的错误如何定位, 这个问题常常需要编码端的错误控制算法配合

2. 解码端的错误隐藏算法, 这类算法本身比较容易实现但是它是基于定位的结果,  和重构的错误数据;而重构错误需要的数据往往由编码端错误控制算法来提供支持。

 

H.264 BP包含3种利于鲁棒性的可选工具:

  • 帧内刷新
  • FMO(Flexible Macroblock Order)
  • 冗余片Redundant Slice (RS)

 

常见3类算法:

  • 不对称保护算法
  • 分层算法和多通道算法
  • 信道层算法和鲁棒熵编码等添加冗余信息进行验证的错误控制算法

 

扩展阅读:论文《H.264 基线档次中的错误隐藏实现》,周泉等著;

 

附录

Annex A. MPEG-2MP4编码数据复用方法

                                                         MPEG-2 编码复用系统

 

在数字广播和DVD中,ISO/IEC(国际标准化组织/国际工程联合会)已标准化了的MPEG-2系统规格;对于便携式终端,作为以第3代移动体通信系统的规格化为目的的国际标准化团体的3GPP(Third Generation Partnership Project),在定为基于无线的动态图像投递规格的 TS26.234(Transparent end-to-end packet switched streaming service)中采用了由 ISO/IEC JTC1/SC29/WG 11标准化了的MP4(iso/iec 14496)文件格式;MPEG-4 AVC(Advanced Video Coding)已被标准化为现在普及了的MPEG-2 VisualMPEG-4 Visual的 后继规格。因此可以预想:今后将用MPEG-2系统规格和MP4文件格式(以下称为MP4)MPEG-4 AVC的编码视频数据进行复用、播放、存储或投递。

A.1 存取单元(AU)

MPEG-2系统和MP4(ISO/IEC 14496-14)中,作为处理编码数据时的基本单位使用存取单元(AU)

 

 

对于MPEG-4 AVC,除了图像解码所需的数据,AU数据中还可以包含不是解码所必需的被称为SEI(Supplemental Enhancement Information,附加增强信息)的辅助信息和AU的界限信息等。这些数据 全部存储于NAL(Network Adaptation Layer,网络适应层)单元中。并且,在MPEG-2系统中,被称为 Access Unit Delimiter(存取单元分界符)的表示AU开始的NAL单元必须附加在AU的开头。

NAL单元由头和有效载荷构成(参考6.1小节),头的大小为1个字节,包含表示有效载荷中存储的数据的类型(以下称为NAL单元类型)的字段(field)等。NAL单元类型,根据切片 (slice)SEI等数据的种类来定义值,在取得存储于NAL单元中的数据的种类时,参考NAL单元类型。

AU中,除了与1幅图像相当的切片数据,还存储报头信息和SEINAL单元,但是在NAL单元中不存在用于识别NAL单元数据的界限的信息,因此在存储AU时,可以在各NAL单元的开头附加界限信息。作为界限信息(即图1所述”识别信息”),有附加0x000001的由3个字节表示的开始码前缀的方法(以下称为字节流格式和附加NAL单元大小的方法(以下称为NAL大小格式)这两种。对于具有AU的开头NAL单元和特定的NAL单元类型值的NAL单元,规 定在开始码前缀之前附加1个以上的zero_byte(值为0x001个字节)。在MPEG-2系统中使用字节流格式,在MP4中使用NAL大小格 式

A.2 切片和报头信息:

切片分为IDR(Instantaneous Decoder Refresh,瞬时解码器刷新)切片和除此之 外的切片两种。所谓IDR切片是画面内编码了的切片数据,SPS/PPS等报头信息只能在 IDR切片中进行切换。在图像中包含IDR切片时,同一图像内的其它的切片也全部是IDR切片,因此,以下将包含IDR切片的AU称为IDR AU。另外,将由IDR AU到下一个IDR AU的即将到的AU构成的单位称为序列(这与iso/iec 14496中视频序列定义一致),在对AU的切片数据解码时,只会参考序列内的AU,因此能以序列单位进行随机存取。

报头信息有SPSPPS两种。SPS是以序列单位固定的报头信息,PPS是能以图像单位切换的报头信息。SPSPPS都可以具有多个,每个SPSPPS用索引号区别。另外,1NAL单元存储1SPS或者PPS。各图像所参考的SPSPPS的索引号如下这样取得。首先,图像所参考的PPS的索引号表示在切片数据的头部中。接着,为了在PPS中表示PPS所参考的SPS的索引号,对图像所参考的PPS进行分析,取得图像所参考的PPS的索引号。图像所参考的SPSPPS在图像的切片数据解码时是必须的。

A.3 MPEG-2系统中复用AU

MPEG-2系统中,编码数据首先被复用PES(Packetized Elementary Stream,打包基本流)包,然后PES包再复用为TS(Transport Stream,传输流)包。


2(a)(b)分别示出了PES包和TS包的结构。存取单元(AU)数据存储在PES包的有效载荷中。图2(a)(1)~(3)表示向 PES包的有效载荷存储AU数据的存储例,可以如(1)(2)所示将1个以上的AU集中起来进行存储,也可以如(3)所示将AU数据分开来存储。


                                       图3

并且,在有效载荷中还可以包含与AU数据不同的填充数据。如图3所示,PES包的头从开始码开始,该开始码由0x000001的用3个字节表示的开始码前缀、以及1个字节的流ID构成,总共4个字节。所谓Stream ID是表示PES包的有效载荷数据中所包含的编码数据的种类的识别号码,在MPEG-4 AVC中,能取0xE00xEF的任意值。在头中可以存储在有效载荷内开始的即将到的AU的解码时间(DTS, Decoding Time Stamp)、以及显示时间(PTS, Presentation Time Stamp),但是不一定在所有的PES包中存储这些时间信息,也有不存储时间信息的PES包。在需要没有由PES包的头示出DTS或PTS的AU的时间信息时,对AU数据进行分析,取得与即将到的AUDTS或PTS的差值。另外,PES包的开始位置,通过在TS包的有效载荷内搜索4个字节的开始码来进行检测。

另一方面,PES包的数据,如图2(b)所示,分割成TS包的有效载荷进行存储。TS包是大小为188字节的固定长度的包,由4个字节的头、适应字段、有效载荷数据构成。而且,适应字段只存在于设 置了头内的特定的标志的情况下。头中包含被称为表示TS包传送的数据的种类的PID的识别号码、以及被称为continuity_counter的计数 器。continuity_counter4位的字段,在同一PIDTS包中按发送顺序逐一增加,达到最大值时进行循环。TS包的PID、与TS包传送的数据的种类的对应关系,由用另外的TS包发送的节目信息提供。

因此,在接收TS包时,首先取得TS包的PID,根据PID的值分配包。例如,根据接收开始时取得的节目信息,表示MPEG-4 AVC的数据由PID32TS包传送时,通过取得PID32TS包,能取得MPEG-4 AVCAU 数据。在此,在接收的TS包的continuity_counter值产生间隔时,表示在传送路径中产生了丢包。另外,将AU数据从TS包中分离出来时, 从TS包的有效载荷数据中分离PES包,再从分离的PES包中分离AU数据。

A.4 MP4中复用AU


                                                                               图5

MP4中,样本单位的报头信息和媒体数据由被称为Box的目标单位管理。在此,所谓样本是在MP4中处理媒体数据时的基本单位,1个样本相当于1AU。对各样本以解码时间(DTS)顺序,升序分配样本号,样本号按每个样本逐一增加。图5(a)表示 Box的结构,由以下的字段构成。

size:包含了size字段的Box整体的大小

type:是Box的识别符,通常由4个字母文字表示。字段长度为4个字节,在MP4文件内检索Box时,通过判断连续的4个字节部分的数据是否与type字段的识别符一致来进行。

versionBox的版本号

flags:对每个Box设置的标志信息数据:存储报头信息和媒体信息。

而且,由于versionflags不是必需的,因此有的Box不存在这些字段。之后,在Box的参考中使用type字段的识别符,例如type“moov”Box称为moov。图6(b)表示MP4文件中的Box结构。MP4文件由ftypmoovmdat或者moof构 成,ftyp配置在文件的开头。ftyp包括用于识别MP4文件的信息,在mdat中存储媒体数据。mdat所包含的各媒体数据被称为磁道 (track),各磁道由磁道ID识别。接着,在moov中存储与mdat的各磁道所包含的样本有关的报头信息。在moov内,如图6(a)所示,Box 分层配置,在音频、视频等各媒体磁道中,报头信息分别存储于各自的trak中。在trakBox也分层配置,样本的大小和解码时间、显示开始时间或者可 随机存取的样本的信息等存储于stbl内的各Box(6(b))。可随机存取的样本被称为同步样本,同步样本的样本号的一览由stbl内的stss表 示。上面,磁道内的所有样本的报头信息都存储在moov中,但是也可以对磁道进行分割而片段化,以片段(segment)单位存储报头信息。对于分割了磁 道的单位,报头信息由moof表示,在图7的例子中,可以将mdat #1所存储的样本的报头信息存储在moof #1中。

                    图6

                                      图7

扩展阅读:

ISO/IEC 13818-1. 

ITU-T H.220-229.传输多路复用和同步

国内公开专利(公开号:CN1642221 A

 

 

Annex B. 图像质量的通用评价标准

图像质量评价的方法可分为主观评价和客观评价两大类。主观评价即采用人眼主观观察的方法对压缩图像进行打分评价,可依据的标准有《ITU-R BT.500》和《GYT+134-1998数字电视图像质量主观评价方法》。客观评价即采用客观的模型、公式进行计算,得出结果。和主观评价相比,客观 评价的优点是执行简单、标准统一,但由于人眼视觉系统(HVS)十分复杂,目前还没有任何一个客观标准可以完全准确的模拟人眼视觉感受,所以要注意的是, 客观评价可作为参考,但不能完全替代主观评价。客观评价的标准有许多,下面简单介绍一下比较常用的几种标准:

 

MSE

MSE即均方误差(Mean Squared Error)。计算公式为:

     

Rij是原始图像内容,Cij是压缩后的图像内容,MN分别是图像的宽和高。

  PSNR

  PSNR即峰值信噪比(Peak signal noise ratio),计算简单,物理意义清晰,在图像质量的客观评价中应用十分的广泛。

  计算公式为:

     

n为每个像素点的比特数,MSE即上面提到的均方误差。

  从PSNR的公式里我们可以看出,PSNR计算时对图像中的各个像素点同样对待,没有充分考虑人眼的视觉特性。

  SSIM

  SSIM即基于结构相似度(structure similarity)的图像质量评价方法,SSIM的理论认为图像具有很强的结构特性,结构信息是图像最主要的信息,人眼主要是提取视觉区域中图像的结构信息。

   SSIM方法将原始图像和失真图像划分成重叠或不重叠的子块,通过原始图像与失真图像的对应图像块的亮度相似函数(Luminance Comparison)、对比度相似函数(Contrast Comparison)、结构相似函数(Structure Comparison)来计算失真图像块和原始图像对应块的结构相似度,评价图像的质量好坏。

Annex C. DCT的原理

  离散余弦变换DCT(Discrete Cosine Transform) ,是一种实数域变换,其变换核为余弦函数,计算速度快。DCT 除了具有一般的正交变换性质外,它的变换阵的基向量能很好地描述图像信号的相关特征。因此,图像信号的变换中,DCT 变换被认为是一种准最佳变换。近年颁布的一系列视频压缩编码的国际标准建议中,都把DCT 作为其中的一个基本处理模块。而且对于具有一阶马尔柯夫过程的随机信号,DCT十分接近于Karhunen - Loeve 变换,也就是说它是一种最佳近似变换。
DCT变换在图像压缩中有很多应用,它是JPEGMPEG等数据压缩标准的重要数学基础。在JPEG压缩算法中,先将输入图像划分为8 ×8 16 ×16的图像块,对每个图像块作DCT 变换,然后舍弃高频的系数,并对余下的系数进行量化以进一步减少数据量;最后使用无失真编码来完成压缩任务。解压缩时首先对每个图像块做DCT 反变换,然后将图像拼接成一副完整的图像。

Annex D. 学习资源:

1. Thomas Wiegand写的一些有关H.264/AVC的文章或书籍:

http://iphome.hhi.de/wiegand/pubs.htm

2. http://www.vcodex.com/.《H.264 And MPEG-4 Video Compression》、《THE H.264 ADVANCED VIDEO COMPRESSION STANDARD, 2nd Edition, by Iain E. Richardson. 

3. 毕厚杰 主编,《新一代视频压缩编码标准H.264-AVC(2)

4. ISO/IEC 13818 part 1/2

5. ISO/IEC 14496 part 1/2/10/14

6. RFC 3550/3551/6184

7. www.qtc.jp/3GPP/Specs/, The 3GPP transparent end-to-end packet-switched streaming service (PSS) specification consists of six 3GPP TSs: 3GPP TS 22.233 [1], 3GPP TS 26.233 [2], 3GPP TS 26.234 [3], 3GPP TS 26.244 [4], 3GPP TS 26.2465[5] and 3GPP TS 26.246 [6]. 

8. 国内论坛:http://www.chinavideo.org/forum.php

9. H.264开源项目:Xvid(编/解码)x264(编码)ffmpeg(解码), JM(编/解码)。


转载本文请注明出处 http://blog.csdn.net/chinadragon76/article/details/22408727。

你可能感兴趣的:(网络技术)