KPX 通过 Google 阅读器发送给您的内容: [笔记]低码率H.264视频心得 于 10-2-8 通过 ACG Scrutineer » 技术宅区 作者:admin 从86那接了点私活,大体上就是帮某些有需求的客户做些适合于streaming的视 频。由于Target platform是flash v10搭载的电脑,于是那个老掉牙恶心死人的 VP6/7就被我直接pass了,由于有文件大小的要求这个问题最终演化成了一个低码 率H.264视频的实践问题。由于组里的480p双兼容mp4也算是典型的低码率应用,所 以略作些整理吧。对我而言,perferred的toolchain是avisynth+x264+ffmpeg,当 然我不用ffmpeg编码,只是拿来mux flv而已。 首先来看Video部分,avisynth+x264的黄金搭档也正是我最熟悉的两个工具。考虑 到处理的视频大多都是实写(PAL),因此avisynth中只需要稍微做点降噪,再来 点锐化就好了。我选择的方案是dfttest+LSFmod,dfttest用默认参数轻轻一 抹,LSFmod的参数上也尽量做到柔和即可。此处值得注意的是由于最终目标码率很 低(<250k@CIF),因此任何锐化(High Emphasis)的操作都可能会导致最终产品 的画面布满玻璃渣,所以锐化滤镜的选择和参数的使用需要特别注意。我的 LSFmod里strength只用了55。 源滤镜是处理这种千奇百怪视频的重要绊脚石,好在有ffmpegsource2这种通吃滤 镜,什么VFR我才不管呢,反正都是PAL的实写,统统喂给它就能搞定了。只是要注 意有时候源是yuv444的,所以出现奇数分辨率也一点都不奇怪了。 下面来看x264的参数,我的理念是在bitrate budgets下获得最好的(主观)质 量,因此基本的rc方案毫无疑问的使用了1pass CRF+2pass Bitrate的方法。这样 既能控制最终码率,又不至于被码率限死而影响质量。好在这个任务没有对播放端 的解码延迟有什么要求,于是可以尽情的用些容易导致latency的参数了。 在确定rc方案之后,下面就是挑出一些参数来做优化了。我把参数的优化分成五个 部分:ME、降码率、除块、帧类型、兼容性。 //顺便一说,我用的--crf 20的1pass。 首先是me,由于低码率的限制,精确的me(与之相对是更小的误差值)是必不可少 的,相反在码率很充足的情况下me的精确性到来的不是那么重要了。我使用的是 --me tesa --subme 10 --trellis 2 --merange 48的方案,tesa保证了尽可能精 确的ME,subme 10保证了子块预测/细化时的准确性,merange 48相对于CIF来说也 足够大了。 其次是码率的控制,开大mbtree的lookahead和降低qcomp数值是一个好方法,我是 用的是--rc-lookahead 100 --qcomp 0.5的配置。有人可能会提到aq-mode 2,但 我实际的感觉,aq-mode 2在这种极低的码率环境下会出现恼人的mosaic effect,所以aq-mode还是坚持使用mode 1,strength=1.0的默认设置吧。 然后是除块的参数,在前面avisynth的参数选择上我就说了锐化参数必须小 心,x264里关于锐化/除块的参数有二,psy-rd和deblock。psy-rd的strength越 高,玻璃渣就越明显(低码率下),deblock的负值则被认为有助于恢复锐利的线 条和texture。所以对我这种环境,两者的效果都应该降低。我选择的是--psy-rd 0.2:0 --deblock 1:1的配置。 最后是帧类型和兼容性,这两个分类间相互的依赖性比较大,因此联合起来考虑。 对流媒体而言,考虑到分辨率的大小,--profile main --level 3.0的设置足矣。 ref 3和bframes 8则完全是个人喜好,如果要ep的话bframes 16也是可以的。 --partitions b8x8,p8x8,i4x4,i8x8也是个人喜好,而且在level=3.0时这也就等 于all了,我没有考虑把i8x8排除在外,因为target platform是标准终端因此没有 必要。 vbv-bufsize和maxrate完全是为了限制1pass crf可能的飚码率问题,我定在了 1600和1200。keyint和min-keyint则是一如既往的fps*10和1的配置。 1pass完整参数如下: x264 –profile main –level 3.0 –pass 1 –crf 20 –stats “proc.stats” –min-keyint 1 –keyint 250 –ref 3 –bframes 8 –b-adapt 2 –direct auto –partitions none –no-fast-pskip –no-dct-decimate –vbv-bufsize 1600 –vbv-maxrate 1200 –rc-lookahead 100 –qcomp 0.5 –psy-rd 0.2:0 –deblock 1:1 –me tesa –merange 48 –subme 10 –trellis 2 –sar 1:1 –thread-input –threads 6 -o NUL proc.avs 2pass的完整参数如下: x264 --profile main --level 3.0 --pass 2 --bitrate 340 --stats "proc.stats" --min-keyint 1 --keyint 250 --ref 3 --bframes 8 --b-adapt 2 --direct auto --partitions b8x8,p8x8,i8x8,i4x4 --no-fast-pskip --no-dct-decimate --vbv-bufsize 1600 --vbv-maxrate 1200 --rc-lookahead 100 --qcomp 0.5 --psy-rd 0.2:0 --deblock 1:1 --me tesa --merange 48 --subme 10 --trellis 2 --sar 1:1 --thread-input --threads 6 -o proc.264 proc.avs 在x264 rev.1376下实际跑的结果,crf 20的1pass在上述参数下基本码率不会超过 400k,于是2pass的bitrate模式限制就比较宽松了。基本*0.75就能得到适合的 2pass码率。 音频: 音频部分用ffmpeg处理,通用格式就是 ffmpeg -i somefile.ext -acodec libfaac -ab 64k oputfile.aac 有时ffmpeg的编译没有开启外部libfaac.dll的支持,解决方法要不就自己 configure然后make要不就去找其他人编译的带libfaac支持的binary咯。 另外此处用的是average bitrate模式,也可以用-q这种质量模式,目标64kbps的 音频q的数大约是0.25。 Mux: 继续ffmpeg: ffmpeg -i somefile.mp4 -vcodec copy -acodec copy oputfile.flv 于是就大功告成了。 可从此处完成的操作: - 使用 Google 阅读器订阅ACG Scrutineer » 技术宅区 - 开始使用 Google 阅读器,轻松地与您喜爱的所有网站保持同步更新