How tough life is, how strong you should be!
分类: LINUX
2013-01-09 10:21:58
视频编码的基本概念
码流(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模式的第二步,编码器会根据第一次压缩时获得的影片的信息和用户指定的最终文件大小,自动分配码率,低动态的分配得少一些、大动态的分配得多一些,总之尽量保证最终文件大小为用户指定的大小。
原文地址:http://blog.chinaunix.net/uid-2384984-id-1989696.html