H.264视频编码基本知识

一、视频编码技术的发展历程

  视频编码技术基本是由iso/iec制定的mpeg-x和itu-t制定的h.26x两大系列视频编码国际标准的推出。从h.261视频编码建议,到 h.262/3、mpeg-1/2/4等都有一个共同的不断追求的目标,即在尽可能低的码率(或存储容量)下获得尽可能好的图像质量。而且,随着市场对图像传输需求的增加,如何适应不同信道传输特性的问题也日益显现出来。于是ieo/iec和itu-t两大国际标准化组织联手制定了视频新标准h.264来解决这些问题。

h.261是最早出现的视频编码建议,目的是规范isdn网上的会议电视和可视电话应用中的视频编码技术。它采用的算法结合了可减少时间冗余的帧间预测和可减少空间冗余的dct变换的混合编码方法。和isdn信道相匹配,其输出码率是p×64kbit/s。p取值较小时,只能传清晰度不太高的图像,适合于面对面的电视电话;p取值较大时(如 p>6),可以传输清晰度较好的会议电视图像。h.263 建议的是低码率图像压缩标准,在技术上是h.261的改进和扩充,支持码率小于64kbit/s的应用。但实质上h.263以及后来的h.263+和 h.263++已发展成支持全码率应用的建议,从它支持众多的图像格式这一点就可看出,如sub-qcif、qcif、cif、4cif甚至16cif等格式。

mpeg-1标准的码率为1.2mbit/s左右,可提供30帧cif(352×288)质量的图像,是为cd-rom光盘的视频存储和播放所制定的。mpeg-l标准视频编码部分的基本算法与h.261/h.263相似,也采用运动补偿的帧间预测、二维dct、vlc游程编码等措施。此外还引入了帧内帧(i)、预测帧(p)、双向预测帧(b)和直流帧(d)等概念,进一步提高了编码效率。在mpeg-1的基础上,mpeg -2标准在提高图像分辨率、兼容数字电视等方面做了一些改进,例如它的运动矢量的精度为半像素;在编码运算中(如运动估计和dct)区分"帧"和"场";引入了编码的可分级性技术,如空间可分级性、时间可分级性和信噪比可分级性等。近年推出的mpeg-4标准引入了基于视听对象(avo:audio- visual ob-ject)的编码,大大提高了视频通信的交互能力和编码效率。 mpeg-4中还采用了一些新的技术,如形状编码、自适应dct、任意形状视频对象编码等。但是mpeg-4的基本视频编码器还是属于和h.263相似的一类混合编码器。

总之,h.261建议是视频编码的经典之作,h.263是其发展,并将逐步在实际上取而代之,主要应用于通信方面,但h.263众多的选项往往令使用者无所适从。mpeg系列标准从针对存储媒体的应用发展到适应传输媒体的应用,其核心视频编码的基本框架是和 h.261一致的,其中引人注目的mpeg-4的"基于对象的编码"部分由于尚有技术障碍,目前还难以普遍应用。因此,在此基础上发展起来的新的视频编码建议h.264克服了两者的弱点,在混合编码的框架下引入了新的编码方式,提高了编码效率,面向实际应用。同时,它是两大国际标准化组织的共同制定的,其应用前景应是不言而喻的。

二、h.264介绍

  h.264是itu-t的vceg(视频编码专家组)和 iso/iec的mpeg(活动图像编码专家组)的联合视频组(jvt:joint video team)开发的一个新的数字视频编码标准,它既是itu-t的h.264,又是iso/iec的mpeg-4的第10 部分。1998年1月份开始草案征集,1999年9月,完成第一个草案,2001年5月制定了其测试模式tml-8,2002年6月的 jvt第5次会议通过了h.264的fcd板。2003年3月正式发布。

h.264和以前的标准一样,也是dpcm加变换编码的混合编码模式。但它采用"回归基本"的简洁设计,不用众多的选项,获得比h.263++好得多的压缩性能;加强了对各种信道的适应能力,采用"网络友好" 的结构和语法,有利于对误码和丢包的处理;应用目标范围较宽,以满足不同速率、不同解析度以及不同传输(存储)场合的需求;它的基本系统是开放的,使用无需版权。

在技术上,h.264标准中有多个闪光之处,如统一的vlc符号编码,高精度、多模式的位移估计,基于4×4块的整数变换、分层的编码语法等。这些措施使得h.264算法具有很的高编码效率,在相同的重建图像质量下,能够比h.263节约50%左右的码率。h.264的码流结构网络适应性强,增加了差错恢复能力,能够很好地适应ip和无线网络的应用。

三、h.264的技术亮点

1、分层设计

  h.264的算法在概念上可以分为两层:视频编码层(vcl:video coding layer)负责高效的视频内容表示,网络提取层(nal:network abstraction layer)负责以网络所要求的恰当的方式对数据进行打包和传送。在vcl和nal之间定义了一个基于分组方式的接口,打包和相应的信令属于nal的一部分。这样,高编码效率和网络友好性的任务分别由vcl和nal来完成。

vcl层包括基于块的运动补偿混合编码和一些新特性。与前面的视频编码标准一样,h.264没有把前处理和后处理等功能包括在草案中,这样可以增加标准的灵活性。

nal 负责使用下层网络的分段格式来封装数据,包括组帧、逻辑信道的信令、定时信息的利用或序列结束信号等。例如,nal支持视频在电路交换信道上的传输格式,支持视频在internet上利用rtp/udp/ip传输的格式。nal包括自己的头部信息、段结构信息和实际载荷信息,即上层的vcl数据。(如果采用数据分割技术,数据可能由几个部分组成)。

2、高精度、多模式运动估计

h.264支持1/4或1/8像素精度的运动矢量。在1/4像素精度时可使用6抽头滤波器来减少高频噪声,对于1/8像素精度的运动矢量,可使用更为复杂的8抽头的滤波器。在进行运动估计时,编码器还可选择"增强"内插滤波器来提高预测的效果。

在h.264的运动预测中,一个宏块(mb)可以按图2被分为不同的子块,形成7种不同模式的块尺寸。这种多模式的灵活和细致的划分,更切合图像中实际运动物体的形状,大大提高了运动估计的精确程度。在这种方式下,在每个宏块中可以包含有1、2、4、8或16个运动矢量。

在h.264中,允许编码器使用多于一帧的先前帧用于运动估计,这就是所谓的多帧参考技术。例如2帧或3帧刚刚编码好的参考帧,编码器将选择对每个目标宏块能给出更好的预测帧,并为每一宏块指示是哪一帧被用于预测。

3、4×4块的整数变换

h.264 与先前的标准相似,对残差采用基于块的变换编码,但变换是整数操作而不是实数运算,其过程和dct基本相似。这种方法的优点在于:在编码器中和解码器中允许精度相同的变换和反变换,便于使用简单的定点运算方式。也就是说,这里没有"反变换误差"。变换的单位是4×4块,而不是以往常用的8×8块。由于用于变换块的尺寸缩小,运动物体的划分更精确,这样,不但变换计算量比较小,而且在运动物体边缘处的衔接误差也大为减小。为了使小尺寸块的变换方式对图像中较大面积的平滑区域不产生块之间的灰度差异,可对帧内宏块亮度数据的16个4×4块的dc系数(每个小块一个,共16个)进行第二次4×4块的变换,对色度数据的4个4×4块的dc系数(每个小块一个,共4个)进行2×2块的变换。

h.264为了提高码率控制的能力,量化步长的变化的幅度控制在12.5%左右,而不是以不变的增幅变化。变换系数幅度的归一化被放在反量化过程中处理以减少计算的复杂性。为了强调彩色的逼真性,对色度系数采用了较小量化步长。

4、统一的vlc

h.264 中熵编码有两种方法,一种是对所有的待编码的符号采用统一的vlc(uvlc :universal vlc),另一种是采用内容自适应的二进制算术编码(cabac:context-adaptive binary arithmetic coding)。cabac是可选项,其编码性能比uvlc稍好,但计算复杂度也高。uvlc使用一个长度无限的码字集,设计结构非常有规则,用相同的码表可以对不同的对象进行编码。这种方法很容易产生一个码字,而解码器也很容易地识别码字的前缀,uvlc在发生比特错误时能快速获得重同步。

5、帧内预测

在先前的h.26x系列和mpeg-x系列标准中,都是采用的帧间预测的方式。在h.264中,当编码intra图像时可用帧内预测。对于每个4×4块(除了边缘块特别处置以外),每个像素都可用17个最接近的先前已编码的像素的不同加权和(有的权值可为0)来预测,即此像素所在块的左上角的17个像素。显然,这种帧内预测不是在时间上,而是在空间域上进行的预测编码算法,可以除去相邻块之间的空间冗余度,取得更为有效的压缩。

如图 4所示,4×4方块中a、b、...、p为16 个待预测的像素点,而a、b、...、p是已编码的像素。如m点的值可以由(j+2k+l+2)/ 4 式来预测,也可以由(a+b+c+d+i+j+k+l)/ 8 式来预测,等等。按照所选取的预测参考的点不同,亮度共有9类不同的模式,但色度的帧内预测只有1类模式。

6、面向ip和无线环境

h.264 草案中包含了用于差错消除的工具,便于压缩视频在误码、丢包多发环境中传输,如移动信道或ip信道中传输的健壮性。

为了抵御传输差错,h.264视频流中的时间同步可以通过采用帧内图像刷新来完成,空间同步由条结构编码(slice structured coding)来支持。同时为了便于误码以后的再同步,在一幅图像的视频数据中还提供了一定的重同步点。另外,帧内宏块刷新和多参考宏块允许编码器在决定宏块模式的时候不仅可以考虑编码效率,还可以考虑传输信道的特性。

除了利用量化步长的改变来适应信道码率外,在h.264中,还常利用数据分割的方法来应对信道码率的变化。从总体上说,数据分割的概念就是在编码器中生成具有不同优先级的视频数据以支持网络中的服务质量qos。例如采用基于语法的数据分割(syntax-based data partitioning)方法,将每帧数据的按其重要性分为几部分,这样允许在缓冲区溢出时丢弃不太重要的信息。还可以采用类似的时间数据分割(temporal data partitioning)方法,通过在p帧和b帧中使用多个参考帧来完成。

在无线通信的应用中,我们可以通过改变每一帧的量化精度或空间/时间分辨率来支持无线信道的大比特率变化。可是,在多播的情况下,要求编码器对变化的各种比特率进行响应是不可能的。因此,不同于mpeg-4中采用的精细分级编码fgs(fine granular scalability)的方法(效率比较低),h.264采用流切换的sp帧来代替分级编码。

四、h.264的性能比较

tml -8为h.264的测试模式,用它来对h.264的视频编码效率进行比较和测试。测试结果所提供的psnr已清楚地表明,相对于mpeg-4(asp: advanced simple profile)和h.263++(hlp:high latency profile)的性能,h.264的结果具有明显的优越性。

h.264的psnr比mpeg-4(asp)和h.263++ (hlp)明显要好,在6种速率的对比测试中,h.264的psnr比mpeg-4(asp)平均要高2db,比h.263(hlp)平均要高3db。6 个测试速率及其相关的条件分别为:32 kbit/s速率、10f/s帧率和qcif格式;64 kbit/s速率、15f/s帧率和qcif格式;128kbit/s速率、15f/s帧率和cif格式;256kbit/s速率、15f/s帧率和 qcif格式;512 kbit/s速率、30f/s帧率和cif格式;1024 kbit/s速率、30f/s帧率和cif格式。

音视频开发(24)---H.264视频编码基本知识相关推荐

  1. 【H.264/AVC视频编解码技术详解】四. 常见H.264视频编解码器(X264和JM)及参考软件JM的下载与编解码

    <H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...

  2. 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 关键帧数据格式 | 非关键帧数据格式 | x264 编码后的数据处理 | 封装 H.264 视频数据帧 )

    文章目录 安卓直播推流专栏博客总结 一. x264 编码后的 H.264 数据帧 二. RTMP 协议中 关键帧 / 非关键帧 数据格式 说明 三. 判定 H.264 帧数据分隔符 四. 初始化 RT ...

  3. MPEG-4 AVC/H.264 视频编码资源列表(中文)

    ============================================================================ 软件编解码器: =============== ...

  4. 【Android RTMP】安卓直播推流总结 ( 直播服务器搭建 | NV21 图像采集 | H.264 视频编码 | PCM 音频采集 | AAC 音频编码 | RTMP 包封装推流 )

    文章目录 一. 安卓直播推流专栏博客总结 二. 相关资源介绍 三. GitHub 源码地址 四. 整体 Android 直播推流数据到服务器并观看直播演示过程 Android 直播推流流程 : 手机采 ...

  5. H.264视频编码在VC++.Net中的实现

    From: http://blog.csdn.net/xwchen/article/details/5052981 引言:H.264编码技术是俱乐部在过去一段时间内研究的一个方向,对该编码技术进行过实 ...

  6. H.264视频编码在VC .Net中的实现(H264全文)

    H.264视频编码在VC++.Net中的实现 引言:H.264编码技术是俱乐部在过去一段时间内研究的一个方向,对该编码技术进行过实际的开发和应用,并取得了很大的收获.下面将重点介绍H.264视频编码在 ...

  7. H.264视频编码基本知识

    一.视频编码技术的发展历程 视频编码技术基本是由ISO/IEC制定的MPEG-x和ITU-T制定的H.26x两大系列视频编码国际标准的推出.从H.261视频编码建议,到 H.262/3.MPEG-1/ ...

  8. 【FFmpeg编码实战】(2)将YUV420P图片集编码成H.264视频文件(方法二)

    [FFmpeg编码实战](2)将YUV420P图片集编码成H.264视频文件(方法二) 一.编码成 H.264 视频文件,运行结果 二.编码成 MPEG4 视频文件,运行结果 三.编码成 AV_COD ...

  9. Windows 下令 OpenCV 支持 h.264 视频编码的方法

    引言 OpenCV 和 ffmpeg 修改 opencv_ffmepgdll 的步骤 安装 MinGW 编译 x264 编译 ffmpeg 生成 opencv_ffmpegdll 准备 生成 测试 结 ...

最新文章

  1. 好久没更新了,马上回来,精彩继续
  2. 关系型数据库之Mysql备份(五)
  3. 【鸿蒙 HarmonyOS】UI 布局 ( 网格布局 TableLayout )
  4. linux下ssh文件配置,允许root远程用密码登录
  5. springboot设置UTF-8
  6. r psm倾向性匹配_南瓜香料指标psm如何规划季节性广告
  7. setsockopt , getsoctopt 函数的Level 参数和 name 参数对应表!!!
  8. php千封邮件怎么快速发送,如何在PHP中无限制地发送数千封电子邮件?
  9. javascript下的数值型比较真的没有那么简单
  10. linux下源码安装apache服务
  11. cmd命令将web项目打成jar包_首发!JDK14之jpackage命令尝鲜
  12. scanf()接受不同类型的参数的一个例子
  13. vcenter客户端控制虚拟服务器报错:“VMRC 控制台的连接已断开”
  14. 推荐一款好用的文件加密传输软件——Kleopatra(含详细使用文档)
  15. 在旭日X3派开发板上使用USB Wifi来提高网络速度
  16. Linux-4.4-x86_64 内核配置选项简介
  17. Linux系统下的文件和文件夹相关操作(创建/删除/修改权限)
  18. [ISA]部署ISA防火墙策略的十六条守则
  19. 单模光电转换器怎么接_光纤收发器及其连接方式图解!
  20. android获取wifi开关,Android WiFi开发(一)--WiFi开关与状态监听

热门文章

  1. QT5开发及实例学习之四容器类
  2. python 通达信上传云端_Python读取通达信本地数据
  3. python虚拟开发环境搭建(virtualenv和virtualenvwrapper)
  4. 在著名出版社出版书,你也行——记录我写书出版的经历和体会
  5. Web前端的学习路线,你真的知道吗?
  6. NYOJ 116士兵杀敌(二) 树状数组
  7. E-Learning是学习系统而不是教育系统
  8. Asp.net(C#)给图片加上水印效果
  9. Postgresql - MATERIALIZED VIEW
  10. JavaScript获取距离某天前或后的日期