购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1
音视频的编码标准

本节介绍音视频常见的编码标准,首先描述音视频编码几十年来的发展历程,接着叙述音视频文件的几种常见封装格式,然后阐述国家数字音视频标准AVS,以及如何给FFmpeg集成AVS2的编解码器。

2.1.1 音视频编码的发展历程

音视频的压缩与解压操作对应着音视频数据的编码和解码过程,压缩音视频意味着对音视频的原始数据进行编码重排,解压音视频意味着将特定编码的音视频代码还原为原始数据。

音视频的编解码标准起源于ITU-T(ITU Telecommunication Standardization Sector,国际电信联盟电信标准分局)下属的VCEG(Video Coding Experts Group,视频编码专家组)和ISO(International Organization for Standardization,国际标准化组织)下属的MPEG(Moving Pictures Experts Group,动态图像专家组),其中ITU-T是ITU(International Telecommunication Union,国际电信联盟)下辖的制定电信标准的分支机构,MPEG是国际标准化组织下辖的制定多媒体压缩编码标准的分支机构。

1990年,ITU-T发布了H.261标准,该标准采用运动补偿的帧间预测、DCT变换、自适应量化、熵编码等压缩技术。H.261标准在压缩编码时只有I帧和P帧,没有B帧,其中I帧指的是关键帧(Key-Frame),也叫作帧内图像(Intra-Frame),P帧指的是前向预测编码帧(Predictive-Frame),B帧指的是双向预测内插编码帧(Bi-Directional Interpolated Prediction Frame)。

1992年,MPEG发布了MPEG-1标准,该标准的传输速率为每秒1.5Mbps(M是Million的缩写,表示百万。8比特等于1字节),图像分辨率约为352×240,主要应用于VCD(Video Compact Disc,影音光碟)。MPEG-1标准分为5部分,其中第二部分为图像层,第三部分为声音层,这两个部分定义了CD光盘的视频和音频压缩格式。MPEG-1音频部分的第三层协议被称为MPEG-1 Layer 3(MP3),它是互联网上广泛应用的音频压缩标准,与CD信号相比实现了11∶1的压缩率。

1994年,ITU-T和MPEG联合发布了H.262/MPEG-2标准,该标准的传输速率在每秒3Mbps到每秒10Mbps,图像分辨率约为720×480,主要应用于数字电视和DVD(Digital Video Disc,数字视频光盘)。MPEG-2标准的第二部分规定视频编码格式为H.262,该格式的图像编码包含I帧、P帧和B帧,其中I帧是独立的完整图像,无须参考其他图像;P帧属于预测图像,需要参考前面的I帧或者P帧;B帧属于双向预测图像,它同时参考了前后两帧的图像。因为MPEG-2拥有出色的性能,能够用于HDTV(High Definition Television,高清晰度电视),所以本来打算给HDTV设计的MPEG-3标准被终止了。

1996年,ITU-T发布了H.263标准,该标准主要应用于低码率的视频会议。H.263在H.261的基础上做了许多改进,前后发布了三个版本,最终被H.264所取代。

1997年,MPEG发布了MPEG-2标准的第七部分,定义了新的音频编码格式为AAC(Advanced Audio Coding,高级音频编码),并将AAC划分为三个配置,分别是AAC-LC(Low Complexity AAC,低复杂度的AAC)、标准AAC、AAC-SSR(Scalable Sampling Rate AAC,采样率可调节的AAC)。

1999年,MPEG发布了MPEG-4标准,它是低码率下的多媒体通信压缩标准,传输速率在每秒4.8K比特到每秒64K比特之间(K是Kilo的缩写,表示千),图像分辨率为176×144。MPEG-4标准的第二部分规定了视频的编解码器(比如Xvid),第三部分规定音频编解码采用AAC,该标准的AAC是MPEG-2 AAC的改进版。为了将二者区分开,通常把改进版称作MPEG-4 AAC,简称MP4A,也称M4A。MPEG-4 AAC在原来AAC的基础上加上了LTP(Long Term Prediction,长期预测)和PNS(Perceptual Noise Substitution,感知噪声替代)等技术。

1999年,MPEG发布了MPEG-4的第一个修正案,其中包含AAC的低延迟版本AAC-LD(Low Delay AAC,低延迟的AAC)。AAC-LC和AAC-LD的区别在于:AAC-LC广泛应用于MP4视频文件,而AAC-LD主要用于实时音视频通信。

2001年,ITU-T的视频编码专家组和ISO的运动图像专家组MPEG共同成立了联合视频编码组(Joint Video Team,JVT),专门承担视频编码标准研发,推动和管理H.26x系列的标准制定。

2003年,联合视频编码组发布了H.264/MPEG-4 AVC标准,该标准的图像分辨率主要有240P、480P、720P、1080P四种。其中240P的分辨率为424×240,码率为每秒0.64Mbps(bps全称bit per second,比特每秒);480P的分辨率为848×480,码率为每秒1.28Mbps;720P的分辨率为1280×720,码率为2.56Mbps;1080P的分辨率为1920×1080,码率为5.12Mbps。后面三种可再细分为标清和高清两类,高清版冠以HQ(全称High Quality)与标清区分开。H.264/MPEG-4 AVC(Advanced Video Coding,高级视频编码)标准属于MPEG-4标准的第10部分,随着AVC的发布,MPEG-4标准的视频编解码更多采用了H.264,而非刚制定时的Xvid。

2003年,MPEG发布了MPEG-4 HE-AAC(High Efficiency AAC,高效率的AAC)标准,加入了SBR(Spectral Bandwidth Replication,频谱带宽复制)和PS(Parametric Stereo,参数立体声)等技术,与CD信号相比实现了30∶1的压缩率。9个月之后,MPEG推出了MPEG HE-AAC v2,3GPP也采用了第2版的HE-AAC,并将其命名为Enhanced aacPlus,也称作AAC+。

2007年,MPEG推出了AAC-ELD(Enhanced Low Delay AAC,增强型的低延迟AAC)技术,该技术融合了HE-AAC v2与AAC-LD两个标准。

2013年,联合视频编码组发布了H.265/MPEG-H标准,该标准的第二部分规定视频编解码采用H.265,也就是HEVC(High Efficiency Video Coding,高效视频编码)。相比前代的H.264标准,H.265不仅将压缩率提高了一倍,相较H.264只需其一半带宽就能输出同等质量的视频,而且增加支持4K(电视3840×2160,影院4096×2160)和8K(电视7680×4320,影院8192×4320)两种分辨率的超高清视频。其中4K及更高分辨率被ITU纳入UHDTV(Ultra High Definition Television,超高清电视)的技术标准。

2015年,MPEG发布了MPEG-H 3D音频标准,它提供了沉浸式音频内容的高效编码,支持多个扬声器同时播放,可与360度视频搭配应用。

2021年,联合视频编码组发布了H.266标准,该标准也称作VVC(Versatile Video Coding,多功能视频编码)。据说H.266的压缩效率比H.265又提高了一半,同时VCC(即H.266)在播放时要比HEVC(即H.265)占用更多的CPU资源。

虽然H.26x/MPEG-x系列标准是国际组织公开发布的,不过商业公司如果要使用H.26x的编解码技术,就得向MPEG LA这个专利联盟缴纳专利费(包含版税和授权费)。尤其是技术标准越新,收费就越高,比如H.265/HEVC的收费就达到了H.264/AVC的好几倍,尽管H.265/HEVC的压缩效率更高,可是架不住要价太高,谁家的钱都没法这么挥霍。所以,纵然H.265/HEVC已经推出十余年,但它的市场份额仍然只有H.264/AVC的零头,始终无法得到广泛普及。

2003年,就在H.264/AVC发布的同一年,On2 TrueMotion的公司发布了一款免费的有损压缩视频编解码器,称作VP3。2008年,谷歌公司收购了On2公司,同年就发布了对标H.264/AVC的VP8。为了避开H.264的专利,VP8没有采用一些特别的算法,因此其压缩效率略逊于H.264。2013年,谷歌又发布了对标H.265/HEVC的VP9,虽然VP9的压缩效率仍旧不如H.265,但是VP系列均为免费使用,所以VP8和VP9也占据了一些市场份额。

既然MPEG要对视频编码标准收费,当然不会放过音频编码标准,早在20世纪90年代发布的MP3标准就收取了长达20年的专利费,直到2017年专利到期才停止收费。在此期间,Xiph.Org基金会开展了Ogg项目,并于2002年发布了免费的音频编码标准Vorbis。之后,Xiph公司又于2012年发布了Vorbis的升级版Opus,该标准同样是免费授权的,并由IETF(The Internet Engineering Task Force,互联网工程任务组)实现标准化。

除收费的H.26x/MPEG-x系列,以及免费的VP系列、Vorbis和Opus外,有些公司也开发了自己的音视频压缩标准,比如微软公司的WMV和WMA,RealNetworks公司的RM和RA,Adobe公司的FLV等。在互联网早期,这些音视频格式曾经风靡一时,不过大浪淘沙,如今已经很少见到它们了。

2.1.2 音视频文件的封装格式

经过压缩编码的音视频数据还要按照一定的格式保存为文件,因为音频和视频采用不同的编码标准,而且同步播放要求二者数据交错存储,加上播放器一开始就得知道视频的画面分辨率、音频的采样频率等参数,所以音视频数据必须遵循某种规则来存储,这个符合规则的存储过程称作封装。

音频的封装格式比较简单,由于文件内部只有音频流,没有视频流,因此基本采用哪种音频编码标准,音频文件就叫作什么名字。比如采用MP3编码的音频文件,其文件扩展名就是.mp3;采用AAC编码的音频文件,其文件扩展名就是.aac。

至于视频格式则是丰富多样的,最常见的当数MP4,顾名思义该格式源自MPEG-4标准,它的音视频编码组合通常为H.264+AAC,或者是H.265+AAC。不过H.264+AAC并非只能封装成MP4格式,该组合还能封装为MOV格式和3GP格式,因为这三种格式原本就是一家的。早在PC时代,微软的Windows系统一家独大,为了巩固其垄断地位,又捆绑了IE、Office等自家软件,就连音视频标准都推出自家的WMV与WMA,对应的视频封装格式为ASF。其竞争对手苹果公司为了打破不利局面,于2003年加入国际电信联盟下设的视频编码专家组,向其提供自有的视频编码技术和相关专利,推动了H.264/AVC标准的制定工作。H.264/AVC标准刚发布没多久,苹果公司就宣布在QuickTime软件中加入H.264的编解码器。因此,MP4格式本来就跟苹果公司有着很深的渊源。

不过早期的MP4格式采用Xvid编码,为了与H.264编码的视频区分开,苹果公司将H.264编码的视频格式称作M4V,表示M4V文件是高清版本的MP4。当然,MPEG主推的MP4名称更加深入人心,后来大家默认MP4格式就应该是H.264编码。所以后来M4V不怎么叫了,取而代之的是3GP格式,3GP是MP4格式的简化版本,有时采用H.263编码,常用于手机。苹果公司还在MP4的基础上制定了MOV格式,用于保存电影等高清视频,其内部不止包含音频流和视频流,还能包含代码、脚本、图片等元素,相当于MP4格式的扩展版本。就像同一款手机有精简版、标准版、专业版之分,同出一源的3GP、MP4、MOV也是类似的关系。

谷歌公司发布的VP系列视频编码对应的文件封装格式叫作WebM,内部的音视频编码组合通常为VP8+Vorbis,或者为VP9+Opus。微软公司推出的ASF文件格式的音视频编码组合为WMV+WMA。Adobe公司推出的FLV文件格式的音视频编码组合为FLV+MP3。

上面介绍的几种格式都是对音视频文件的封装,其实在MPEG-2第一部分还定义了系统规范,也就是音视频数据在网络上的流格式。存储在磁盘上的文件,其大小是固定的,播放时长也是不变的,但网络上的视频流却是持续不断的,比如说电视直播,一开始怎么知道它什么时候结束呢?只要网络没断,那么直播视频一直在放。MPEG-2的第一部分就描述了如何将视频流与音频流合成为节目码流和传输码流,其中MPEG2-PS(Program Stream,节目流)用于存储具有固定时长的节目,比如DVD电影;MPEG2-TS(Transport Stream,传输流)用于需要实时传送的节目,比如电视节目。MPEG-2的系统规范如图2-1所示。

图2-1 MPEG-2的系统规范

PS流由许多个PS包组成,PS包又由一个或者多个PES包(Packet Elemental Stream,分组码流或打包码流)组成。一个PS包内还具有同样时间基准的若干PES包,因为PES包的数量不固定,所以PS包的长度是可以变化的。TS流由许多个TS包组成,TS包同样由若干PES包组成,区别在于每个TS包的长度固定为188字节,因此PES包在组成TS包时可能会被切割(前半段给上一个TS包,后半段给下一个TS包)。

由于TS包采用固定长度,因此即使某个TS包的同步信息损坏,接收机也能在固定的位置检测其后TS包的同步信息,从而恢复后续的媒体数据。而PS包的长度是变化的,一旦某个PS包的同步信息丢失,接收机就无法确定下一个PS包的同步位置,使得后面的媒体数据无法恢复。不过在接收TS码流时,需要频繁拼接前后TS之间的PES包,使得TS码流的解析性能不如PS码流。所以说,在信道环境较差导致传输误码较高的时候,一般采用TS码流;在信道环境较好并且传输误码较低的时候,一般采用PS码流。

无论是PS包还是TS包,其内部的PES包又由更底层的ES包(Elementary Stream,基本码流)组成。ES包就是纯粹的音视频数据,PES包给ES包添加了时间戳等同步信息,而PS包和TS包又给PES包添加了数据流识别和传输的必要信息。因为TS包的长度固定,从TS流的任一片段开始都能独立解码,所以可以把TS当成音视频文件的封装格式,这也是有TS视频文件却没有PS视频文件的缘由。

2.1.3 国家数字音视频标准AVS

国际上的音视频编码标准虽多,毕竟是别人家的东西,不如自己家的可靠。2002年6月,我国的数字音视频编解码技术标准工作组成立,主要任务是制订数字音视频的编解码标准,提供数字音视频的编解码技术等。工作组所制定的AVS(Audio Video coding Standard,信源编码标准)是我国具备自主知识产权的第二代信源编码标准,信源编码技术解决的重点问题是数字音视频海量数据(初始数据、信源)的编码压缩问题,故也称数字音视频编解码技术。AVS是一套包含系统、视频、音频、数字版权管理在内的完整标准体系,为数字音视频产业提供更全面的解决方案。AVS是基于我国创新技术和部分公开技术的自主标准,通过简洁的一站式许可政策,解决了AVC专利许可问题的僵局,成为开放式制订的国家和国际标准。

第一代AVS标准制订起始于2002年,指的是《信息技术先进音视频编码》系列国家标准(简称AVS1,国家标准代号GB/T 20090)和广电系列标准《广播电视先进音视频编解码》(简称AVS+)。第一代AVS简称AVS1,它包括系统、视频、音频、数字版权管理4个主要技术标准和符合性测试等支撑标准。第一代AVS编码效率比MPEG-2高2~3倍,与AVC相当,技术方案简洁,芯片实现复杂度低,达到了第二代标准的最高水平。第一代AVS有力支撑了我国音视频产业“由大变强”的升级,多家企业已成功研制了多套AVS标准清晰度编码器、高清晰度编码器和面向移动设备的编码器。

2013年3月18日,基于AVS+的3D节目上星播出。2014年开始,中央电视台14套节目先后采用AVS+高清播出,国内高清和标清节目压缩编码也逐步向AVS+过渡。如今,国内高清和标清节目压缩编码正逐步向AVS+过渡,卫星传输高清频道将采用AVS+,地面数字电视的高清频道直接采用AVS+,而地面数字标清频道全部转换为AVS+。

第二代AVS标准指的是《信息技术高效多媒体编码》系列国家标准(简称AVS2),AVS2主要面向超高清电视节目的传输,支持超高分辨率(4K以上)、高动态范围视频的高效压缩。AVS2支持三维视频、多视角和虚拟现实视频的高效编码,立体声、多声道音频的高效有损及无损编码,监控视频的高效编码,面向三网融合的新型媒体服务。其中4K超高清视频的部分关键技术参数如下:分辨率为3840×2160,帧率为50帧/秒,扫描模式为每行等。

经专业机构测试,第一代AVS的压缩效率与同期的国际标准MPEG-4 AVC/H.264相当,比原视频编码国家标准GB/T 17975.2-2000(等同采用ISO/IEC的MPEG-2)提高一倍以上。同样经严格测试,第二代AVS2的编码效率比第一代标准提高了一倍以上,压缩效率超越国际标准HEVC(H.265),相对于第一代AVS标准,第二代AVS标准可节省一半的传输带宽。

2019年1月1日,我国第二代数字音频编码标准《信息技术 高效多媒体编码 第3部分:音频》(简称AVS2音频标准)正式实施。AVS2音频标准立足提供完整的高清三维视听技术方案,与第二代AVS视频编码(AVS2视频)配套,是更适合超高清、3D等新一代视听系统需要的高质量、高效率音频编解码标准,将应用于全景声电影、超高清电视、互联网宽带音视频业务、数字音视频广播无线宽带多媒体通信、虚拟现实和增强现实及视频监控等领域。

第二代AVS(AVS2标准)音视频标准有着“超高清”和“超高效”的“双超”特点,2018年10月1日,采用AVS2视频标准的CCTV 4K超高清频道正式开播,这也是国内首个上星超高清电视频道。

第三代AVS标准指的是《信息技术 智能媒体编码》系列国家标准,简称AVS3,自2017年开始制定。AVS3主要面向超高清广播影视、全景视频、增强现实/虚拟现实等应用,以及自动驾驶、智慧城市、智慧医疗、智能监控等,支持超高分辨率(8K以上)、全景视频、三维视频、屏幕混合内容视频、高动态范围视频的智能压缩和沉浸式音频场景的应用。AVS3视频标准的主要技术特点体现在:AVS3 视频基准档次采用了更具复杂视频内容适应性的扩展四叉树(Extended Quad-Tree,EQT)划分、更适合复杂运动形式的仿射运动预测、自适应运动矢量精度预测(Adaptive Motion Vector Resolution,AMVR)、更宜于并行编解码实现的片划分机制等技术。

AVS3视频标准主要面向8K超高清,2021年2月1日,中央广播电视总台开播8K超高清试验频道,采用AVS3视频标准。2022年1月1日,北京电视台冬奥纪实频道采用AVS3视频标准播出。2022年1月25日,中央广播电视总台8K超高清频道采用AVS3视频标准播出。2021年11月,AVS3视频标准发布为IEEE 1857.10标准。

注: 本小节以上文字部分摘录自数字音视频编解码技术标准工作组的官方网站(http://www.avs.org.cn/index/list?catid=9)。

FFmpeg从4.1版本开始支持AVS2国标编解码器,只要引入并启用AVS2的编解码库,即可在FFmpeg框架中正常处理AVS2音视频。下面是在Linux系统给FFmpeg集成avs2编解码库的详细步骤。

1.下载avs2编解码库的源码

到以下两个网址下载avs2编解码库的源码,其中xavs2为avs2的编码库,davs2为avs2的解码库。

    https://gitee.com/pkuvcl/xavs2
    https://gitee.com/pkuvcl/davs2

根据以上网址的页面说明,avs2编解码库的源码由北京大学数字视频编解码技术国家工程实验室视频编码组提供。

2.编译和安装avs2的编码库

把下载完的xavs2源码包上传到Linux服务器,接着执行以下命令,依次编译和安装avs2的编码库。

    unzip xavs2-master.zip
    cd xavs2-master/build/linux/
    ./configure --prefix=/usr/local/avs2 --enable-pic --enable-shared
    make -j4
    make install
3.编译和安装avs2的解码库

把下载完的davs2源码包上传到Linux服务器,接着执行以下命令,依次编译和安装avs2的解码库。

    unzip davs2-master.zip
    cd davs2-master/build/linux/
    ./configure --prefix=/usr/local/avs2 --enable-pic --enable-shared
    make -j4
    make install
4.把avs2的pkgconfig目录的路径加载至环境变量PKG_CONFIG_PATH

因为avs2的.pc文件安装到了/usr/local/avs2/lib/pkgconfig,所以需要把该路径添加到环境变量PKG_CONFIG_PATH中,方便FFmpeg自动查找.pc文件,详细的加载步骤说明如下。

01 输入cd命令回到当前用户的初始目录,使用vi打开该目录下的.bash_profile,也就是依次执行以下命令:

    cd
    vi .bash_profile

02 把光标移动到文件末尾,按a键进入编辑模式,然后在文件末尾添加环境变量的配置:

    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/avs2/lib/pkgconfig

接着保存并退出文件,也就是先按Esc键退出编辑模式,再按“:”键,接着输入wq再按回车键,即可保存修改后的内容。

03 执行以下命令加载最新的环境变量:

    source .bash_profile

接着运行下面的环境变量查看命令:

    env | grep PKG_CONFIG_PATH

发现控制台回显的PKG_CONFIG_PATH串包含/usr/local/avs2/lib/pkgconfig,说明pkgconfig目录的路径加载到环境变量中了。

5.重新编译和安装FFmpeg,注意启用avs2的编解码库

回到FFmpeg的源码目录,执行以下命令重新编译和安装FFmpeg,注意configure命令的--enable-libxavs2选项表示启用avs2的编码库,--enable-libdavs2选项表示启用avs2的解码库。

    ./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc
--enable-zlib --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libdavs2
--enable-iconv --enable-gpl --enable-nonfree
    make clean
    make -j4
    make install
6.把avs2的编解码库的路径添加至环境变量

回到当前用户的初始目录下,打开.bash_profile文件,也就是依次执行以下命令:

    cd
    vi .bash_profile

打开bash_profile文件之后,在该文件的末尾添加以下两行配置:

    export PATH=$PATH:/usr/local/avs2/bin
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/avs2/lib

然后保存文件并退出,再执行以下命令加载环境变量:

    source .bash_profile
7.测试验证FFmpeg的avs2编解码功能能否正常使用

由于播放视频的可视化界面要求设备提供显卡支持,而Linux服务器为终端命令行操作,无法在终端播放视频,因此该步骤需在个人计算机上操作。

确保当前目录存在本书提供的测试视频fuzhou.mp4,执行以下命令把该视频由H.264格式转换为avs2格式。

    ffmpeg -i fuzhou.mp4 -r 25 -acodec aac -vcodec avs2 fuzhou.ts

注意新视频的扩展名必须为.ts,不能是.mp4,因为avs2不支持MP4封装格式,只支持TS封装格式。转换命令中的-r 25表示将新视频的帧率调节为每秒25帧,-acodec aac表示把音频流转换为AAC编码,-vcodec avs2表示把视频流转换为avs2编码。

等待fuzhou.ts生成完毕,再执行以下命令播放采用avs2格式的新视频。

    ffplay fuzhou.ts

运行上面的命令之后,控制台弹出视频播放器窗口,如图2-2所示,说明以avs2编码的TS文件正常播放。

图2-2 以avs2编码的TS视频播放界面 Bi1f9Qr9ZqUaNTid4Td60BB3wDutteFLnaOXZrYqTdjnVD/+lv07d2pHJBajmYr7

点击中间区域
呼出菜单
上一章
目录
下一章
×