妇联评论·译言版
橘化为枳
——探究为何各种H.264编码器表现良莠不齐
作者:Dark Shikari(作者系x264主要开发者之一)
译者:ssnake
校对:秋月
关键词:H.264、失败、视觉心理学优化、率失真优化
原标题为Why so many H.264 encoders are bad(为什么许多H.264编码器表现糟糕),原文链接:
如果潜心钻研各种H.264编码器,你无疑会发现其中表现糟糕者不在少数。当然,也不必惊讶于此,正如史特金定律告诉我们的:任何事物,其中九成都是垃圾 (原文:90% of everything is crap.(Wikipedia作crud,意义接近))。而作为多年来最为公允的视频标准,支持H.264的软件不可胜计,{jd1}数量的巨大使得其中必然 有相当数量的劣质实现方案。
但这并不足以解释优劣H.264编码器之间的鸿沟。优秀的H.264编码器——比如x264——在许多案例中可以以仅仅一半的码率击败上一代的编码器(比 如XviD);而劣质的H.264编码器甚至糟糕到会输给MPEG-2!不同实现方案的差距会如此之大,这似乎是之前的各种标准从未有过的情况……当然, 这里我们找到了一些缘由。
H.264提供了比历代标准都要更加丰富的压缩特性。这也使编码器开发者搬起石头砸自己脚的机会大增。笔者将在下文中概述不同方案的部分差异。绝大多数问 题来自一个简单的事实:在用误差均方(mean squared error)作为编码模式决策(mode decision)的度量衡(metric)时,模糊会显得很好。
由于本文不仅仅与技术社区有关联,笔者将在文中对一些与本文观点直接相关的基本术语略加阐释。
RD = λ × bits + distortion(失真),一种衡量决策有多“合理”的量度。λ是数据对于质量(失真)的价值。比如,只给某个(价值低的)部分很少的数据量(以致其 失真),或许能避免(其他部分)更大的失真。失真由“编码模式决策的度量衡”来测定,最常见的是“误差平方和”。
视觉能量(Visual Energy)是图像或视频中可见细节的总量。好的编码器会保留能量,不使图像显得模糊。
i16×16宏块
优势:i16×16是非常吸引人的模式:得益于分步的离散余弦变换(校对注:H264标准中对i-MB是分成两级做变换的,其中一种方式是先对16×16 的mb下附属的4个4×4 Sub-MB做16点的DCT(准确说是整数变换,DCT的退化形式),然后能得到4个DC分量(4个Sub-MB的{dy}个变换系数);之后将这四个DC 分量写成2×2的矩阵,做第二级的变换,此处用的是2×2的Hadamard变换。),这个模式有着非凡的码流经济性。在帧中相对平整的区域,通常每个宏 块只需要12比特以下甚至只要6比特的数据量。因此,RD编码模式决策会倾向于这种模式。
劣势:它的实际观感太惨了。i16×16模式非常不利于保留视觉能量:当使用该模式时,几乎不会有非0的AC系数,这样它预测部份中的四分之三几乎不会有 一点能量被编码;而且解块滤镜会倾向于模糊掉剩下的细节。再加之以自适应量化(AQ)的缺失,这就是低质量的H.264编码器出现丑陋的16×16马赛克 的主要原因。尽管这个模式本身并不是坏事,但被(H.264)标准所过分强调,而且给RD挖了一个大陷阱。
双线性Qpel(双线性四分之一像素)
优势:Qpel(四分之一像素)显然对压缩有好处,尤其是H.264的Qpel:它是专门为编码器性能而设计的。(H.264中的)Hpel(半像素)滤镜比较慢(因为它是六阶滤镜),但可以预先计算;而Qpel则比较简单,可以实时运算(双线性的)。
劣势:双线性插值会造成模糊,从而造成视觉能量的损失。而由于RD编码模式决策会更倾向于模糊,于是它会很乐意选择用双线性Qpel。此外,最简单的运动 检测(Motion search,或译动态搜寻等)手段(完整像素、迭代半像素、迭代四分之一像素)会更偏向Qpel而非Hpel。尽管十分有用,但如果被编码器过度运 用,Qpel会变成又一个陷阱。
4×4变换
优势:4×4变换能有效编码物体边缘,并有助于形成高效的i4×4帧内模式。4×4变换并不像8×8变换那样需要一个高级的熵编码器(至少CAVLC),也即4×4变换允许一个更小的可变长编码表。
劣势:它太模糊了!相比使用同样量化系数的8×8变换,4×4变换的量化精度较低;又因为Decimation(校对注:带round-off效果的类量 化步骤)的作用,将出现大量未正确处理的区块(uncoded blocks),又一个RD的陷阱。对于编码纹理区域来说,4×4变换十分糟糕,尤其是当纹理细节比变换区域还要大的时候。而且,相比8×8变换,4×4 变换会更多的被解块(deblocked,校对注:至于为啥4×4比8×8更多的被deblocking,这是因为标准本身就默认将所有4×4块判定为 deblocking strength=4,这{dy}位判定条件导致了这个结果。)。尽管自适应变换是一个好消息,但以4×4为默认变换(8×8在其后添加)这一点更像是标准制 定完成后留下的一个瑕疵——尽管对CIF分辨率(352×288)的视频确有优化。
双向预测(Biprediction)
优势:双向预测是一切现代视频编码格式的核心:B帧极大的提升了编码效率,尤其是对相对静态的场景。在常用码率的H.264编码中,仅仅双向预测这一项技 术,就使B帧中的区块可以被大量省略(校对注:当帧间预测的模式选择时,如果发现本宏块与参考帧中某个位置的宏块“xx”一致,则不对其进行任何后续的操 作(预测、变换、量化),只在此宏块上标注“重建时拷贝参考帧的某个宏块”的信息。)。
劣势:双向预测需要再次进行双线性插值,因此会导致模糊,也就会再次成为俘获RD的甜蜜陷阱。这使得双向预测甚至在图像中的非静态区域也被过度使用了——比如胶片噪点,导致B帧中的模糊噪点和P帧中的清晰噪点(交替出现)。
需要指出的是,B帧以及双向预测并非H.264所独有的技术;多年来,它们已是既知的老问题,并且在低码率下更趋严重。
水平、垂直、DC 帧内预测模式
优势:这些模式对于帧内预测体系来说至关重要。DC预测(用左侧边沿和上方边沿的均值)类似于传统的空间帧内预测前的帧内编码,而另两个则对直棱边非常有帮助。总的来说,这三个应该是最常见的帧内预测模式。
劣势:它们难以保留能量。其他的帧内预测模式(均值、ddl(左下对角线)、ddr(右下对角线)、vr(垂直偏右)、hd(水平偏下)、vl(垂直偏 左)、hu(水平偏上))能有效预测那些难以被离散余弦变换编码的频率,从而能够在重构画面时增加视觉能量。但水平、垂直、DC帧内预测则不然。此外,模 式预测系统的工作方式决定了最节约的模式更受青睐(从数据量上来说)。
当然,x264有效的使用了所有这些特性——并无上述绝大多数问题的存在。其他编码器的开发者:学着点!(译者:DS你就吹吧!)
这里有一篇
下面转自(ps:其实是pdf里面的内容拿出来{zh1}的point)
1)fastest preset
ffmpeg -i NFSCAR_x360_trackDrift_HD720P.mov -f mp4 -vcodec libx264 -me_method dia -directpred 1 -me_range 16 -subq 1 -b_qfactor 1.5 -bf 1 -acodec libfaac sample_fastest.mp4
2)fast preset
ffmpeg -i NFSCAR_x360_trackDrift_HD720P.mov -f mp4 -vcodec libx264 -subq 1 -acodec libfaac sample_fast.mp4
3)tradeoff preset
ffmpeg -i NFSCAR_x360_trackDrift_HD720P.mov -f mp4 -vcodec libx264 -subq 3 -acodec libfaac sample_tradeoff.mp4
4)good preset
ffmpeg -i NFSCAR_x360_trackDrift_HD720P.mov -f mp4 -vcodec libx264 -bf 3 -bframebias 5 -flags2 +dct8×8+wpred+bpyramid -trellis 1 -acodec libfaac sample_good.mp4
5)best preset
ffmpeg -i NFSCAR_x360_trackDrift_HD720P.mov -f mp4 -vcodec libx264 -bf 4 -flags2 +dct8×8+wpred+bpyramid -trellis 1 -refs 10 -directpred 3 -me_method umh -subq 7 -acodec libfaac sample_best.mp4
6)extra quality preset
ffmpeg -i NFSCAR_x360_trackDrift_HD720P.mov -f mp4 -vcodec libx264 -bf 4 -flags2 +dct8×8+wpred+bpyramid -refs 8 -directpred 3 -me_method umh -subq 7 -pass 1 -acodec libfaac > dev&null
ffmpeg -i NFSCAR_x360_trackDrift_HD720P.mov -f mp4 -vcodec libx264 -bf 4 -flags2 +dct8×8+wpred+bpyramid -refs 8 -directpred 3 -me_method umh -subq 7 -pass 2 -acodec libfaac sample_extra.mp4
下面表格显示在默认参数情况下编码速度以及平均码率相对百分比:
Preset Name Speed, % Average bitrate, %
Fastest 47 114
Fast 56 109
Tradeoff 70 102
Good 121 89
Best 369 77
Extra Quality 710 72
我测试分辨率1280 x 720,20帧的赛车视频,视频原始大小100442K,视频使用Sorenson Video 3编码,音频使用 MPEG-1 Layer 3编码,使用上诉5种参数分别编码得到53897K、59303K、60251K、63670K、55405K、55405K。我个人比较倾向于best preset参数。
在使用使用如下best参数编码的h264视频,播放时{zg}CPU利用率不超过4%,但效果明显比FLV效果高
ffmpeg -i NFSCAR_x360_trackDrift_HD720P.mov -f mp4 -vcodec libx264 -bf 4 -flags2 +bpyramid+wpred+8×8dct -trellis 1 -refs 10 -directpred 3 -me_method umh -subq 7 -s 352*288 -r 7.5 -aspect 16:9 -acodec libfaac -ab 32k sample_best_352_288_7.mp4
ffmpeg -i NFSCAR_x360_trackDrift_HD720P.mov -f flv -vcodec flv -acodec libmp3lame sample_352_288.flv
视频大小分别为4212K(x264)、4816K(Flash/Sorenson)