<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ACG Scrutineer &#187; ffmpeg</title>
	<atom:link href="http://akiduki.org/html/ytag/ffmpeg/feed" rel="self" type="application/rss+xml" />
	<link>http://akiduki.org</link>
	<description>一个死宅里人格的吐槽发泄欲求不满怨念集散地</description>
	<lastBuildDate>Fri, 27 Aug 2010 16:10:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[笔记]低码率H.264视频心得</title>
		<link>http://akiduki.org/html/y2010/833.html</link>
		<comments>http://akiduki.org/html/y2010/833.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 22:41:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[技术宅区]]></category>
		<category><![CDATA[avisynth]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[FLV]]></category>
		<category><![CDATA[x264]]></category>

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