现在的位置: 首页 > 综合 > 正文

基于MPEG-4的视频压缩基础

2013年10月15日 ⁄ 综合 ⁄ 共 7112字 ⁄ 字号 评论关闭

    微软的wmv9和Divx/Xvid等都是基于MPEG-4发展起来的编码格式,都有不少相通的地方,本文主要介绍视频编码的基础知识,具体的编码设置请参看附录。

    下面是沈晟的l两篇短文,可以从中了解MPEG4和divx3.11、divx4/5、Xvid的发展

『 DivX;-)简介(旧) 』 ---- 作者:沈晟

1998年11月 MPEG-4的国际标准公布

1999年 Microsoft开发了用于Windows Media的MPEG-4CODEC(编码解码平台)

2000年2月份 一位27岁的法国电影爱好者和黑客Je{AAC}ro{ACI}me Rota合作开发了一个新的基于MPEG-4的视频编码解码平台,并同时在网络上开放下载。这就是如今大名鼎鼎的DivX;-)

DivX;-)是一种音视频存储格式、影音媒体,最大的用途就是保存高品质的电影并在网上交流,各项特征如下: 文件类型 多数情况下以AVI文件的形式保存

分辨率 可选择、变化:512x384(4:3画面)、640x272(2.35:1画面)为主

音频 开放特性。可使用Lame MP3(VBR)、Dobly Digtal(AC3)等。DivX;-) Audio、PCM、MP3、DTS等。

码流(容量) 取决于分辨率和具体的编码设置。

质量 视频画质接近DVD水平,超过VCD和LD;

音频可以达到CD质量(48kHz, 96kBits, stereo) 或者是多声道数码声(例如Dobly Digtal 5.1)

系统配置 300MHz CPU,64M 内存,8M显存,系统安装了相应的DivX CODEC后可使用Media Player6.4+或者专用播放软件播放

编码效率 PII-350的系统约为1-2桢/秒

DivX;-) CODEC的开发,实际是挪用了Microsoft Mpeg4v3 4.1.00.4920 Low Motion和4.1.00.4917 Fast Motion的编码核心。经过几个月的修正和一系列更新版本,DivX;-) 现在已经可以在所有主流操作平台上工作和运行,包括Windows, Macintosh, Linux 和 BeOS的DivX版本都已经开放下载。

DivX;-)视频编码所使用的MPEG4编码压缩技术是一种高压缩比有损视频压缩技术。用它来压缩一部容量为5-10G的DVD,保持相同的分辨率和AC3音轨只需要1-2张CDROM,压缩比接近10:1。高压缩比使个人可以更轻松廉价的保存高品质影片,DivX;-)很快就被网民接受并普遍使用。 Internet更为DivX;-)提供了无限的发展空间。现在每天在网络上都会有5、6部最新发行的影片以DivX;-)格式流传。高清晰的影像画面和相对小的文件吸引着上千万的人。上网者只要足不出户,就可以轻松交换高品质的音视频享受。朋友间种种充满乐趣、轻松惬意的影音交流也更为容易。要知道,DivX;-)的流行还只不过是刚刚开始而已。

『 XviD的历史与特点 』 ---- 作者:沈晟

4年以前,在PC上能用的唯一MPEG-4编码器就是由微软所开发的,包括MS MPEG4V1、MS MPEG4V2、MS MPEG4V3的系列编码内核。其中前面两种都可以用来制作AVI文件,至今都作为Windows的默认组件。不过V1和V2的编码质量都还不太好,直到MS MPEG4V3开始,画面质量有了显著的进步。不过微软却决定仅将这个MS MPEG4V3 的视频编码内核封闭在Windows Media流媒体技术,也就是我们熟知的ASF文件之中,不再能用于AVI文件。ASF文件虽然有一些好处,但是过于封闭甚至不能被编辑,惹恼了天不怕地不怕的电影黑客。很快便有小组修改了微软的MS MPEG4V3,解除了不能用于AVI文件的限制,并开放了其中一些压缩参数,由此,也就诞生了我们今天所熟悉的MPEG4编码器DivX;-)3。11。

DivX广泛流行,成为DVDRip的标准,问题是,它的基础技术是非法盗用微软的,只能在地下里流传却上不了台面,无法进行更广泛的产品化,更无法生产硬件播放机。在这种情况下,一些精通视频编码的程序员(包括原DivX 3.11的开发者)成立了一家名为DivXNetworks Inc.的公司,简称DXN。DXN发起一个开放源码项目ProjectMayo,目标是开发一套全新的、开放源码的MPEG4编码软件。特别是完全符合ISO MPEG4标准的OpenDivX CODEC吸引了许多软件高手参与,并很快开发出OpenDivX编码器和解码器原型,之后又开发出更高性能的编码器Encore 2等等。这一时期,主要编码工作是DXN的人在做,而许多技术难关的解决得力于来自开放源码社会的帮助。

就在一切都看起来进展顺利的时候,好戏上演了。ProjectMayo虽然是开放源码,但不是依据GPL(通用公共许可证,一种开放源码项目中常用的保障自由使用和修改的软件或源码的协议)。DXN在设计授权协议时留了一手,2001年7月,就在Encore 2基本成型,差不多可以产品化的时候,DXN另搞了一个DIVX.COM网站,封闭了源码,发布了他们自己的DivX 4。DivX 4的基础就是OpenDivX中的Encore 2,但利用了DivX的牌号,可以说出乎意料的摆了所有人一刀。由于DXN不再参与,ProjectMayo陷于停顿,Encore2的源码也被DXN从服务器上撤下。经过激烈的争论,DXN虽然承认Encore 2在法律上是开放的,但仍然拒绝把它放回服务器。开放源码社会就这样被狠狠地涮了一回。

OpenDivX尚不能实际使用,而DivX 4(以及后续的收费版本--DivX 5)等等都成了私有财产,许多人为打破微软垄断而无偿付出的智慧和劳动仅仅是帮助了DXN发财,这种结果当然是不能被接受的。为此,整个0dayz组织永远的拒绝了DXN公司的DivX4/5,而原OpenDivX开发组中的幸存者,逐渐重新聚拢开发力量,在最后一个OpenDivX版本的基础上,发展出了XviD。

劫后余生的XVID到现在又度过了近1年时间,它继承并发展了OpenDIVX Encore 2,性能得到极大提高,被认为目前世界上速度最快的MPEG4 CODEC。XVID重写了所有代码,并吸取前车之鉴依照GPL发布(注意不再是LGPL,所以谁要是想用它做成产品而不开放源码是非法的)。不过,因为MPEG4还存在专利权的问题,所以XVID只能仿照LAME的做法,仅仅作为对如何实现ISO MPEG-4标准的一种研究交流,网站上只提供源码,如果要使用就要自己编译源码或者到第三方网站下载编译好的可运行版本。

想当初Gaj之流的几个家伙搞OpenDivX的时候,一开始是很像一个像模像样的开放源码项目,很多人都被吸引过去一起开发,测试。直到后来,那几个家伙一夜之间露出骗子的本来面目了,把OpenDivX的成果一股脑带走,变成了封闭源码的DivX4,而后进一步变成现在的收费的DivX5了。本来很好的OpenDivX被逼流产,不过也就促成了今天XviD的诞生、发展和壮大。现在的XVID更可以说超越了DivX 5,以更好的质量,更强的功能挑战着新一代的MPEG4应用战场。

    目前,微软基于Mpeg-4的wmv9在商业应用上也很成功。在微软的巨大影响力下,已经成为新一代DVD标准之一的蓝光DVD的编码器。Divx5依然在商业应用的道路上前进着,似乎在一些avi播放机上可以看到他。Xvid随着1.0版的正式发布,风头正劲,视频编码性能方面确实是当之无愧的王者,开放的Xvid活力无限。另外要介绍一下H.264。H.264是最新的MPEG压缩技术,又名“MPEG4 AVC(Advanced Video Coding)”。H.264的数据压缩率在MPEG2的2倍以上、MPEG4的1.5倍以上。One2公司在H.264基础上开发的VP6在压缩率上有着不错的表现,在低码率的情况下,性能不错。

    下面介绍一下视频编码的基本概念

    码流(Data Rate) 码流是指视(音)频文件在单位时间内使用的数据流量,有时候也叫码率,是Mpeg4画面质量控制中最重要的部分。同样分辨率下,视(音)频文件的码流越大,压缩比就越小,画面质量就越高。试采集同一帧同一分辨率的原版《木乃伊》做细部比较,如下图:

    我们注意观察黑色前景周围的高对比度区域,和背景天空的对比度和碎化程度。以原图为标准画面(10Mbits/s的Mpeg2),可以看到“码流500kbits/s的DivX”高对比度区域呈斑点状,背景天空碎化、混沌;“码流1000kbits/s的DivX”介于前后两者之间;“码流1500kbits/s的DivX”画面柔和,背景天空已经可以准确分辨明暗位置。虽然DivX和原图比较仍有缺陷,但毕竟DivX的码流只有DVD的1/10-1/6。码流1000-1500kbits/s画面质量已经相当令人满意了。 如果对画质有更高的要求而不在乎文件的大小,则可以将码流提高到2000kbits/s以上(系统允许最大值是6000kbits/s)。如下图:

    以2000kbits/s生成的画面已经相当接近原画,很难看出分别了。 可以通过公式来通过控制码流来推算生成文件的大小,以适合个人存放:

码流 x 时间 = 总容量

    这里要注意的是码流的单位,1 byte (B) = 8 bits (b),我们计算机上文件的容量K/M,都是指B

1 Kilobyte(K/KB)=2^10 bytes=1,024 bytes 千字节 1 Megabyte(M/MB)=2^20 bytes=1,048,576 bytes 兆字节

    所以如果用的bits/s的码流计算容量记得要除8,否则就差大了

关键帧

    所有的Mpeg影片都是由16x16见方的小方块构建的。在连续的两帧中“基本相同”的小方块内的像素信息将不被后一帧记录,以节省空间并得到更高的压缩比例。正例如下图中说话的男子,第2到第4帧除了正在移动的嘴部附近画面,其他部分并不一一复制。就可以节省超过70%存储空间。

    但是在这种方式下,多数的帧都并不会记录完整的画面信息。例如在播放第4帧画面时,就必须先得到第1、2、3帧的信息。如果要看第100帧的画面,就必须读取并处理前99帧的数据信息才可以得到。这样就造成影片不能够从中间选定的时间点播放。即使你已经看过前面30分钟的画面,也必须要慢慢的等待电脑一帧一帧的重建前面的画面,这是多么痛苦啊。因此就必须设定合适的“关键帧”。

    适当的加入“关键帧”既可以轻松的在影片的中定位时间点,也方便对影片进行后期编辑和处理,还可以更准确的保证音轨同步、保证画面质量。

三种帧类型

IF——I-frame的缩写,即关键帧。关键帧是构成一个帧组(GOP,Group of Picture)的第一个帧。IF保留了一个场景的所有信息。压缩比为1:7。

PF——P-frame的缩写,即未来单项预测帧,只储存与之前一个已解压画面的差值。压缩比为1:20。

BF——B-frame的缩写,即双向预测帧,除了参考之前解压过了的画面外,亦会参考后面一帧中的画面信息。压缩比为1:50。 

B-Frame(在 MPEG-4 里面正确的名称是 B-VOP)的预测模式有四种: a. Forward 顺向预测,参考前一张画面,记录和前一张画面的差距。和 P-Frame 的预测方法一样。 b. Backward 逆向预测,参考下一张画面,记录和下一张画面的的差距。 c. Bi-Directionally 双向预测,参考前面和后面两张画面,记录的是和「前后两张画面的平均值」的差距。也叫做内插预测,压缩率最高。 d. Direct Mode,不搜寻、纪录动作向量,直接由下一张的 P Frame推导出动作向量。譬如说 I B P,我们可以预测 B 画面的动作必然是介于 I 和 P 两个画面之间,所以我们可以直接用 P 的 MV/2 作为B 的动作向量,这样可以省去记录 MV 的空间。

压缩 B-Frame 的时候会从上面几种预测模式中选压出来最小的一个模式来使用。

三种量化方式:H.263、MPEG和MPEG Custom

H.263——推荐700~900K的码率(比如1CD制作)时使用。保留画面细节不及MPEG量化方式好,但可以达到较好的画面降噪效果,可以让画面看起来更干净一些。推荐压制动画使用本量化方式。H.263 的量化方法,顾名思义,就是使用 H.263 这个压缩规格所使用的量化方法,量化的时候,8x8 的像素方块内的所有 DCT 系数,全部除以同一个数字。(这个动作就叫做量化)例如全部都除以 32,如果有一个 DCT 系数为 15,小于 32,经过相除之后,会被量化为 0,如此便可以省下很多记录的 bits。当然,除的数字越大,量化的误差也就越大,品质也就越差,但是压缩率会越高,压出来档案会越小。我们会利用另一个参数来调整量化的误差,控制最后量化的品质和档案的大小,这个参数叫做 Quantizer。量化的系数会再乘上这个 Quantizer 的倍数,例如原本要除的量化系数是 32,Quantizer 是 2,对应的放大倍数也是 2,最后真正要除的量化系数就变成 32*2 = 64。所以 Quantizer 越大,要除的量化系数就越大,量化误差就越大,品质就越差,但是档案也越小。H.263 的量化方法还规定,相邻的两个 MacroBlock 的Quantizer 不能相差超过 2。

MPEG——建议高码率情况下(比如2CD制作)使用,画质最佳,能保留较多细节。推荐制作电影DVDRIP使用本方式。若在制作动画时使用,可能引起色彩过度不自然、颜色边界处出现噪声等副作用,此时,可搭配Cartoon Mode降低这些副作用。MPEG 的量化方法,高低频系数可以除以不同的量化系数,可以视情况将高频削多一点。这个 8x8 的量化系数,也就是 Quantize Matrix(量化矩阵)。

MPEG Custom——可以加载MPEG自定义量化模板。你可以依照影片内容、使用码率,自订最适当的量化矩阵。比如,压电影的时候常用的hvs-best-picture模板可以兼具MPEG和H.263量化方式的优点,即画面细节和降噪都能得到兼顾。

    总的来说,使用H.263 量化法,压出来的画面会较模糊。MPEG 量化方法的画面会比较锐利。(不过锐利线条的周围、物体的边缘,会产生一些噪声)MS MPEG-4,也就是 DivX 3.11,使用的是 MPEG 的量化方式,所以一直以来,大家的评价都是 MS MPEG-4的画面比较锐利,保留比较多的细节。DivX 4, DivX 5 都是使用 H.263 的量化方法,尤其是 DivX 4,画面非常模糊。虽然表面上看起来压缩瑕疵较少,但是细节都被削光光了。XviD 则可以让使用者自行选择要固定使用哪种量化方法,或者是视情况切换量化的方法。

CBR和VBR

CBR 恒定码率,整个文件的码率是恒定不变的。

VBR 动态码率,文件的码率是变化的,在一些大动态的场景,如爆炸,高速运动的物体等场景码率会很高,而在一些静态的,相对静止缺乏变化的场景码率又很低。

Single pass 和 Two pass     Single pass 编码模式在编码的时候只进行一次运算,直接生成经过编码的视频文件。Two pass需要运算两次,可以理解为先进行一次全局的计算,收集画面信息,并将这些信息记录到信息文件。第二次才根据采集的信息,正式进行压缩,生成压缩文件。Single pass模式编码较简单,速度也很快,但是最终质量不如Twopass模式好。可用于实时采集。Two pass通过第一次运算的信息采集,可以让需要高码率的运动画面可以分配更的码率来保证画面质量。而对于不包含太多运动信息的静态画面,则可以消减分配的码率。Twopass模式可以在影片容量与画面质量之间找到最佳平衡点。

   下面是Xvid1.0里面的两种模式的具体应用,可以更形象的了解这两种编码模式。

Single pass——一次运算,Single pass有两种模式。Single pass模式编码较简单,速度也很快,但是最终质量不如Twopass模式好。可用于实时采集。

Single pass之Target bitrate(CBR)——目标码率模式,单位kbps。最简单的单线编码,选择平均码率后编码。文件大小相对容易控制。

Single pass之Target quantizer(VBR)——目标Q值模式,动态码率。

Twopass——二重运算。这种编码模式分为两步,首先对画面逐帧进行运动侦测,以及对全片段的运动侦测结果进行分析,然后重新以曲线平衡分配每一帧的Q值,以做到:需要高码率的运动画面可以分配更多空间、更高的码率、更低的Q值来保证画面质量;而对于不包含太多运动信息的静态画面,则可以消减分配的码率。这种把好钢用在刀刃上的做法,是XviD作为第二代MPEG4编码的核心内容。可以说,Twopass模式可以在影片容量与画面质量之间找到最佳平衡点,这也是大多数人都乐意花费更多时间采用这种方式的原因。

Twopass-1st pass——二重运算,第一次运算。这是Twopass模式的第一步。在这一步中,编码器会用最高质量编码(量化值2),同时收集画面信息,并将这些信息记录信息文件(stats)当中提供第二次运算的时候参考。

Twopass-2nd pass——二重运算,第二次运算。这是Twopass模式的第二步,编码器会根据第一次压缩时获得的影片的信息和用户指定的最终文件大小,自动分配码率,低动态的分配得少一些、大动态的分配得多一些,总之尽量保证最终文件大小为用户指定的大小。

抱歉!评论已关闭.