摘要:
视频编解码一直是多媒体领域的基石技术之一。经过了多年的发展,ISO/IEC 和 ITU-T 等组织制定了多种视频编码标准,极大推动了多媒体技术的发展进步,这其中以 H.264/MPEG-4 AVC 在当前业界的影响最大。H.264 的广泛应用,不仅仅得益于优秀的算法标准,还因为得到了开源界的广泛支持,其中 x264 便是最典型的开源项目之一。本文作为”x264视频编码器应用与实现“系列博文的开篇之作,首先简单讨论视频压缩编码的背景和发展,并进一步讨论 H.264 与 x264 的一些基本概念。
一. 常用视频压缩编码标准
视频应用在人们的生产和生活中几乎无处不在,从娱乐领域的数字电视广播、网络视频节目播放,到专业领域的远程视频会议、远程医疗等。相对于文字和声音,视频图像可以携带更加丰富、形象的信息,而这带来的最大问题便是更加庞大的数据量以及更高的存储和传输代价。并且随着时代的发展,越来越多的应用场景对视频画面尺寸和清晰度等要求越发提高,自始至终都在对多媒体信息的存储和传输提出更加严峻的挑战。因此,视频数据的压缩编码算法作为多媒体数据处理的基石一直备受研究者关注,业界多个高校、科研院所和企业研究机构等多年来一直致力于视频压缩编码算法的研究,并形成了多种有影响力的技术方案,并整合为多种不同的视频压缩编码标准。
当前业界从事视频编码算法的标准化组织主要有两个,即 ITU-T 和 ISO。
ITU-T,全称International Telecommunications Union – Telecommunication Standardization Sector,即国际电信联盟——电信标准分局。该组织下设的VECG(Video Coding Experts Group)主要负责面向实时通信领域的标准制定,主要制定了H.261/H263/H263+/H263++等标准。
ISO,全称International Standards Organization,即国际标准化组织。该组织下属的MPEG(Motion Picture Experts Group),即移动图像专家组主要负责面向视频存储、广播电视、网络传输的视频标准,主要制定了MPEG-1/MPEG-4等。
实际上,真正在业界产生较强影响力的标准均是由两个组织合作产生的。比如MPEG-2、H.264/AVC和H.265/HEVC等。
除了上述两个组织之外,其他比较有影响力的标准还有:
- Google:VP8/VP9;
- Microsoft : VC-1;
- 国产自主标准:AVS/AVS+/AVS2
主流的视频编码标准的发展历程如下图所示:
在以上多种视频编码标准中,目前行业常用的有 H.264/AVC、H.265/HEVC、MPEG-2、VP8/VP9 和 AVS 系列等。除了 H.264/AVC 外,其余的标准均存在一定的问题:
- H.265/HEVC:压缩率高,但算法运算复杂度更高;专利许可更严苛;
- AVS/AVS+/AVS2:市场认可度不高,仅在部分广电系统内应用;
- MPEG-2:编码性能已经落后,不能满足当前高清、超高清视频的需求;
- VP8/VP9:由 Google 牵头开发,目前仅在 YouTube 等 Google 旗下视频企业使用;
因此,作为目前应用最广泛的压缩编码标准,H.264/AVC (以下简称为 H.264)毫无悬念占据了业界大部分的市场份额。
二. H.264/AVC 基本概念
H.264 是自 MPEG-2 在 DVD 和数字电视广播等领域取得巨大成功后,ITU-T与MPEG合作产生又一重要成果。H.264 标准是属于MPEG-4家族的一部分,即 MPEG-4 系列文档 ISO-14496 的第 10 部分,因此又称作 MPEG-4/AVC。同MPEG-4重点考虑的灵活性和交互性不同,H.264着重强调更高的编码压缩率和传输可靠性,在数字电视广播、实时视频通信、网络流媒体等领域具有广泛的应用。
同早期视频编码标准类似,H.264 同样采用块结构的混合编码框架。其主要结构图如下图所示:
在 H.264 进行编码的过程中,每一帧的H图像被分为一个或多个条带(slice) 进行编码。每一个条带包含多个宏块(MB,Macroblock)**。宏块是 H.264 标准中基本的编码单元,其基本结构包含一个包含 16×16 个亮度像素块和两个 8×8 色度像素块,以及其他一些宏块头信息。在对一个宏块进行编码时,每一个宏块会分割成多种不同大小的子块进行预测。帧内预测采用的块大小可能为 16×16 或者 4×4,帧间预测/运动补偿采用的块可能有7种不同的形状:16×16、16×8、8×16、8×8、8×4、4×8和4×4。相比于早期标准只能按照宏块或者半个宏块进行运动补偿,H.264 所采用的这种更加细分的宏块分割方法提供了更高的预测精度和编码效率。在变换编码方面,针对预测残差数据进行的变换块大小为 4×4 或 8×8。相比于仅支持8×8大小的变换块的早期版本,H.264 避免了变换逆变换中经常出现的失配问题。
H.264标准中采用的熵编码方法主要有上下文自适应的变长编码 CAVLC 和上下文自适应的二进制算数编码 CABAC,根据不同的语法元素类型指定不同的编码方式。通过这两种熵编码方式达到一种编码效率与运算复杂度之间的平衡。
同前期标准类似,H.264 的条带也具有不同的类型,其中最常用的有I条带、P条带和B条带等。另外,为了支持码流切换,在扩展档次中还定义了 SI 和 SP 片。
- I条带:帧内编码条带,只包含I宏块;
- P条带:单向帧间编码条带,可能包含P宏块和I宏块;
- B条带:双向帧间编码条带,可能包含B宏块和I宏块;
视频编码中采用的如预测编码、变化量化、熵编码等编码工具主要工作在slice层或以下,这一层通常被称为 **“视频编码层”(Video Coding Layer, VCL)**。相对的,在slice以上所进行的数据和算法通常称之为 **“网络抽象层”(Network Abstraction Layer, NAL)**。设计定义NAL层的主要意义在于提升H.264格式的视频对网络传输和数据存储的亲和性。
为了适应不同的应用场景,H.264 也定义了多种不同的档次:
- 基准档次(Baseline Profile):主要用于视频会议、可视电话等低延时实时通信领域;支持 I 条带和 P 条带,熵编码支持 CAVLC 算法。
- 主要档次(Main Profile):主要用于数字电视广播、数字视频数据存储等;支持视频场编码、B条带双向预测和加权预测,熵编码支持 CAVLC 和 CABAC 算法。
- 扩展档次(Extended Profile):主要用于网络视频直播与点播等;支持基准档次的所有特性,并支持 SI 和 SP 条带,支持数据分割以改进误码性能,支持 B 条带和加权预测,但不支持 CABAC 和场编码。
- 高档次(High Profile):适用于高压缩率和型能场景;支持 Main Profile 的所有特性,以及 8×8 帧内预测、自定义量化、无损压缩格式以及更多的 YUV 采样格式等。
目前比较知名的 H.264 编码器实现主要有:
- x264:应用最广泛的 H.264 软件编码器;
- JM:H.264 标准工作组维护的算法标准参考软件;
- openH264:由思科公司开发的采用 BSD 协议的开源 H.264 编解码器;
- 其他实现:MainConcept/QuickTime/Elecard 等;
三. 关于 x264 的基本概念
在当前诸多开源的 H.264 软件编码方案中,x264 可谓是其中应用范围最广、知名度最高的项目。x264 最初由 Laurent Aimar 创建并负责前期开发,后期主要由 Loren Merritt, Fiona Glaser, Anton Mitrofanov 和 Henrik Gramner 等人负责开发和维护,并以 GNU GPL 协议开源。
作为一个 H.264 视频编码器,x264 的作用同其他编码器实现一样,旨在将一系列像素格式的输入图像压缩编码,输出符合 H.264 标准的视频码流。相对其他的开源编码器项目,x264 对 H.264 提供了更完整的支持,并且还进行了部分心理视觉优化以提升编码输出的主观效果。在内部实现上,x264 在多处代码中使用了汇编对算法实现进行了优化,提升了整体运行效率,使得 x264 在编码压缩率和运行速度方面取得较好的平衡。
x264 的代码托管于 VideoLan 的网站上。在形式上,除了源代码外,x264 不仅提供了可直接作为工具运行的二进制可执行程序,还可以编译生成库文件(如 libx264.a),以 SDK 的形式供第三方应用或 SDK (如 FFmpeg 等)集成。得益于这样良好的设计,x264 方得以在多媒体领域取得了广泛的影响力与应用场景。
x264 可执行程序的官方下载地址为:http://download.videolan.org/pub/videolan/x264/binaries/,提供了包括 Windows、Linux 和 macOS 等多平台下不同版本的可执行程序。如果官方提供的可执行程序不能满足需求,还可以直接获取源代码进行二次开发。x264 源代码的下载方式可通过“git clone”轻易实现:
git clone https://code.videolan.org/videolan/x264.git
关于如何从源代码编译 x264,将在后续文章中详细讨论。
关于 x264 与 H.264 的关系,我们需要对概念有一个较为准确的理解。有部分初学者可能会提出类似这样的问题:”H.264 和 x264 哪个更好?哪个速度更快或效率更高?“等等。事实上,这个问题本来就是一个不成立的问题,因为二者不属于同一个可比较的范畴。如同我们在前文中所讨论的,H.264 为一种视频压缩编码标准,规定了符合该标准的视频码流的二进制格式以及解析和解码的基本方法。在 H.264 标准中不会对图像数据的编码流程做出具体的规定或限制,更不会提供一款标准的编码器产品,而是将编码过程的实现交由软硬件编码器或者解决方案开发厂商自行设计开发,只需保证输出的码流格式符合协议的规定,标准的解码器可正常解码输出图像即可。而 x264 作为 H.264 编码器的一种具体的软件实现方案,实现了将图像序列压缩为视频码流的编码具体化和工程化。换言之,H.264 是一项虚拟的技术标准或规范,其形态可能是一部文档,而 x264 则是这项虚拟技术的实体化,其形态是一套源代码及其编译生成的可执行程序或 SDK,二者存在本质的区别。
作者:殷汶杰
原文链接:http://www.videotechnology.cn/2021/05/27/x264-1-md/
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。