NMM视频技术(旧)

 找回密码
 成为会员
搜索
查看: 9469|回复: 9

[AVC(H.264)] 橘化为枳——探究为何各种H.264编码器表现良莠不齐 (初稿试看,欢迎斧正)

    [复制链接]
发表于 2009-11-18 20:21 | 显示全部楼层 |阅读模式
本帖最后由 ssnake 于 2009-11-19 22:41 编辑

一不小心还真疼出来了……当然错误绝对不少,先放这里请各路高手斧正……
最终大概还是会做妇联评论吧= =

橘化为枳
——探究为何各种H.264编码器表现良莠不齐

V3稿


作者:Dark Shikari(作者系x264主要开发者之一)
译者:ssnake
校对:秋月
关键词:H.264、失败、视觉心理学优化、率失真优化
原标题为Why so many H.264 encoders are bad(为什么许多H.264编码器表现糟糕),原文链接:http://x264dev.multimedia.cx/?p=164

如果潜心钻研各种H.264编码器,你无疑会发现其中表现糟糕者不在少数。当然,也不必惊讶于此,正如史特金定律告诉我们的:任何事物,其中九成都是垃圾(原文:90% of everything is crap.(Wikipedia作crud,意义接近))。而作为多年来最为公允的视频标准,支持H.264的软件不可胜计,绝对数量的巨大使得其中必然有相当数量的劣质实现方案。

但这并不足以解释优劣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是分成两级做变换的,其中一种方式是先对16x16的mb下附属的4个4x4 Sub-MB做16点的DCT(准确说是整数变换,DCT的退化形式),然后能得到4个DC分量(4个Sub-MB的第一个变换系数);之后将这四个DC分量写成2x2的矩阵,做第二级的变换,此处用的是2x2的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变换能有效编码物体边缘,并有助于形成高效的i4x4帧内模式。4×4变换并不像8×8变换那样需要一个高级的熵编码器(至少CAVLC),也即4×4变换允许一个更小的可变长编码表。
劣势:它太模糊了!相比使用同样量化系数的8×8变换,4×4变换的量化精度较低;又因为Decimation(校对注(我直接抄了,不懂=.=):带round-off效果的类量化步骤)的作用,将出现大量未正确处理的区块(uncoded blocks),又一个RD的陷阱。对于编码纹理区域来说,4×4变换十分糟糕,尤其是当纹理细节比变换区域还要大的时候。而且,相比8×8变换,4×4变换会更多的被解块(deblocked,校对注:至于为啥4x4比8x8更多的被deblocking,这是因为标准本身就默认将所有4x4块判定为deblocking strength=4,这第一位判定条件导致了这个结果。)。尽管自适应变换是一个好消息,但以4×4为默认变换(8×8在其后添加)这一点更像是标准制定完成后留下的一个瑕疵——尽管对CIF分辨率(352×288)的视频确有优化。

双向预测(Biprediction)
优势:双向预测是一切现代视频编码格式的核心:B帧极大的提升了编码效率,尤其是对相对静态的场景。在常用码率的H.264编码中,仅仅双向预测这一项技术,就使B帧中的区块可以被大量省略(校对注:当帧间预测的模式选择时,如果发现本宏块与参考帧中某个位置的宏块“完全”一致,则不对其进行任何后续的操作(预测、变换、量化),只在此宏块上标注“重建时拷贝参考帧的某个宏块”的信息。)。
劣势:双向预测需要再次进行双线性插值,因此会导致模糊,也就会再次成为俘获RD的甜蜜陷阱。这使得双向预测甚至在图像中的非静态区域也被过度使用了——比如胶片噪点,导致B帧中的模糊噪点和P帧中的清晰噪点(交替出现)。
需要指出的是,B帧以及双向预测并非H.264所独有的技术;多年来,它们已是既知的老问题,并且在低码率下更趋严重。

水平、垂直、DC 帧内预测模式
优势:这些模式对于帧内预测体系来说至关重要。DC预测(用左侧边沿和上方边沿的均值)类似于传统的空间帧内预测前的帧内编码,而另两个则对直棱边非常有帮助。总的来说,这三个应该是最常见的帧内预测模式。
劣势:它们难以保留能量。其他的帧内预测模式(均值、ddl(左下对角线)、ddr(右下对角线)、vr(垂直偏右)、hd(水平偏下)、vl(垂直偏左)、hu(水平偏上))能有效预测那些难以被离散余弦变换编码的频率,从而能够在重构画面时增加视觉能量。但水平、垂直、DC帧内预测则不然。此外,模式预测系统的工作方式决定了最节约的模式更受青睐(从数据量上来说)。

当然,x264有效的使用了所有这些特性——并无上述绝大多数问题的存在。其他编码器的开发者:学着点!(译者:DS你就吹吧!

评分

1

查看全部评分

 楼主| 发表于 2009-11-18 20:27 | 显示全部楼层
嗯补充一句,初稿请勿转载
发表于 2009-11-18 21:42 | 显示全部楼层
看DS这语气颇有王婆卖瓜的架势
发表于 2009-11-19 06:35 | 显示全部楼层
ds喷完编码器开始喷解码器了
http://x264dev.multimedia.cx/?p=212
发表于 2009-11-19 07:16 | 显示全部楼层
提几个问题
1. 阶层式离散余弦变换
原文叫heirarchical DC transform,如果翻成阶层式,作为我第一反应是stair-wise;但其实这里不是stair-wise,而是多步的变换。H264标准中对i-MB是分成两级做变换的,其中一种方式是先对16x16的mb下附属的4个4x4 Sub-MB做16点的DCT(准确说是整数变换,DCT的退化形式),然后能得到4个DC分量(4个Sub-MB的第一个变换系数);之后将这四个DC分量写成2x2的矩阵,做第二级的变换,此处用的是2x2的Hadamard变换。2x2的Hadamard变换极其简单,H_2=(1 1;1 -1)

2. 有助于高效的i4×4帧内模式构建骨干
原文是“helps form the backbone of the highly efficient i4×4 intra mode”
somewhat forms the backbone,不是backbone of somewhat
我个人可能会翻成“(它)是帮助形成高效率i4x4帧内模式的后援”

3. 而且,它会比8×8变换更多的被解块。
此处加上注释(deblocked)比较好。
至于为啥4x4比8x8更多的被deblocking,这是因为标准本身就默认将所有4x4块判定为deblocking strength=4,这第一位判定条件导致了这个结果。

4. uncoded blocks
这个的意思不知道坑蛇你怎么理解的。

5. 这也让双向预测经常被过度使用于图像中的非静态区域
”This makes biprediction get overused even in non-constant areas of the image“
这使得双向预测甚至在图像中的非静态区域也被过度使用了。
此处的逻辑应该是因为他是RD陷阱(而为何是RD陷阱在文章最开始既有说明),所以才会被用到不该用的场合(亦即非静态区域),所以才会被称为“过度”使用。
我觉得坑蛇你的译文,没有体现出这个逻辑链中的“不该用的场合”这一点。
另外关于p-skip, b-skip MB,我对省略一词的翻译持保留意见。
-----------------
对ds说的最后一点,我持保留意见,在预测-残差变换-量化混合编码方案中,预测和参差变换只是两个一定程度上无关的方式,虽然可以把他们看成两张滤过量度不同的滤纸。
这样说来,如果预测本身即是很准确的,那么后面的残差必然变小,也就是说最后编码残差需要的码率也小,那即是一种优秀的预测方式,不存在什么丢失能量的问题。
 楼主| 发表于 2009-11-19 10:45 | 显示全部楼层
回复 5# akiduki
感谢秋月大指点~

4. uncoded blocks
这个的意思不知道坑蛇你怎么理解的。
这里我理解的是:没有被熵编码的区域。

另外关于p-skip, b-skip MB,我对省略一词的翻译持保留意见。
我也不知道该怎么翻译=。=

我现在改成:正常码率的H.264编码中,仅仅双向预测这一项技术,就使B帧中的区块可以被大量跳过。


其他均支持秋月大的意见。
发表于 2009-11-19 11:55 | 显示全部楼层
-.-其实不用注我的名字也行啦
关于uncoded blocks,说没有被熵编码并非完全正确,而且正确的一部分也似乎跳过了中间一部,即先要决定这个mb是否是p-skip或者b-skip;如果是skip类型的话,则可以成为没有被熵编码的块(其实side info也是要熵编码的-.-)
不正确的部分就在于,如果不是p/b-skip,4x4也一样糟糕,具体我在下面一一道来XDD
所以我觉得ds说的coded/uncoded,是从原始信息是否被编码器正确的考虑进去并处理衡量的。

坑蛇你把decimation这词翻成滤波,也许这个地方就是造成你误解了uncoded原因,这个地方的decimation不叫滤波,应该是带round-off效果的类量化步骤,由于4x4的本地性过好,在大部分情况下4x4的预测残差都趋于平滑,这也就导致了变换后的系数普遍接近0值(AC系数),这时再加上decimation的作用,其结果就是所有的AC分量都被抹去了,这也是为啥ds说4x4太模糊的原因。
说到这相信大家都记得--no-dct-decimate这个参数,它就是x264里防止4x4块糟糕表现的一个功能。(当然之前模式判定时会有更多的技术防止纹理之类的场景掉入4x4模式中)

关于p/b-skip,简单来说,就是当帧间预测的模式选择时,如果发现本mb与参考帧中某个位置的mb"完全"一致,则不对他进行任何后续的操作(预测、变换、量化),只在此mb上标注“重建时拷贝参考帧的某个mb”这样的信息。
显然p/b-skip的好处就是在时域内缓慢变化场景时能节省大量码率。
下面文章片段是从IEEE Trans. on Circuits and Systems for Video Technology 03年的一篇H.264的Founder撰写的介绍H.264的文章里对p/b-skip的介绍。
264_intro.jpg
 楼主| 发表于 2009-11-19 21:33 | 显示全部楼层
-.-其实不用注我的名字也行啦
关于uncoded blocks,说没有被熵编码并非完全正确,而且正确的一部分也似乎跳 ...
akiduki 发表于 2009-11-19 11:55

继续听讲……继续V……

嘛,话说这里的decimation彻底翻译不出了……

skip的话我觉得省略、跳过这样译都是合理的……但又都体现不出“拷贝”的意思来。。

嗯这篇文章对我确实难了点……
发表于 2009-11-20 00:28 | 显示全部楼层
坑蛇你翻的很好啦~
说的我也想翻下这篇关于色彩的文章了
http://www.glennchan.info/articles/technical/chroma/chroma1.htm
其实我还欠着大虾好多债呢(死
 楼主| 发表于 2009-11-20 10:31 | 显示全部楼层
坑蛇你翻的很好啦~
说的我也想翻下这篇关于色彩的文章了

其实我还欠着大虾好多债呢(死
akiduki 发表于 2009-11-20 00:28

呀这是好文章呢~期待秋月大大作~
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

小黑屋|手机版|NMM视频技术

GMT+8, 2019-10-15 10:29 , Processed in 0.047459 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表