X264使用介紹
x264是一個開源的H.264視頻編碼函數庫。是最好的有損視頻編碼器。
主頁: http://www.videolan.org/developers/x264.html
x264.nl當前版本信息:Template:X264ver
H.264和x264
H.264是ITU(International Telecommunication Unite 國際通信聯盟)和MPEG(Motion Picture Experts Group 運動圖像專家組)聯合制定的視頻編碼標準。從1999年開始,到2003年形成草案,最後在2007年定稿有待核實。在ITU的標準里稱為H.264,在MPEG的標準里是MPEG-4的一個組成部分--MPEG-4 Part 10,又叫Advanced Video Codec,因此常常稱為MPEG-4 AVC或直接叫AVC。
H.264編碼能實現非常好的壓縮比,有廣泛的適用碼率(適於從超低碼率低延遲的電話會議到高碼率的BluRay光盤和HDTV碼流),良好的硬件支持(以PSP、iPod和顯卡DXVA為代表)和眾多強大的廠商作後盾。
x264始於2003年,從當開源社區的MPEG4-ASP編碼器Xvid小有所成時開始的,經過幾年的開發,特別是Dark Shikari加入開發後,x264逐漸成為了最好的視頻編碼器。
獲取x264
x264的主頁上只用git提供原始碼。雖然官方網站不提供編譯好的版本,但是有很多人在編譯x264,特別是Win32平台的編譯版。
- http://x264.nl 的編譯版沒有任何patch,即所謂純淨版。
- jeeb編譯版
- komisar編譯版
- rack編譯版,關注Current Patches, Where to get them, How they affect speed/output的新帖
- VFR Maniac編譯版
- xvidvideo.ru編譯版
- MythCreator的編譯版
- roozhou的支持DirectShow輸入的版本。
- 還有doom9上的Current Patches, Where to get them, How they affect speed/output和doom10上的Getting the latest x264,都會有最新的編譯版
我們一般選擇32位的最新版。
此外,可以關注由@dgwxx維護的twitter機械人@264bot,它每半小時檢查一次x264.nl更新,報告32bit和64bit版本的更新。
命令行界面的x264
我們下載到的x264.exe是一個命令行工具,不需要安裝,隨便放在哪裏都能運行。雙擊x264.exe只能看到打開了一個黑色的窗口裏在刷着什麼,然後就沒了。x264.exe需要在命令行里輸入命令,沒有GUI。
不可否認有GUI的工具用來很方便,更容易上手,比如用的最廣泛的[http:// MeGUI],此外還有ripbot、staxrip等GUI。doom9上有[1]都是各種GUI,一一試過來看看自己喜歡什麼。MeGUI可以自動更新編碼常用的軟件,作為自動下載的工具倒是不錯。本篇教程主要講解命令行參數,GUI也是調用同一個x264,因此都用對應的選項。
命令行的操作
按Win+R鍵調出運行,輸入cmd,回車,出現黑底白字的窗口和幾行字,其中有 「C:\Document and Settings\User\>」表示當前所在的目錄,後面閃的光標代表等待輸入內容。
圖
假設x264.exe在E:\Encoder\文件夾,輸入
cd /D E:\Encoder
回車
圖
改變當前目錄到E:\Encoder了。接下來,輸入
x264
回車
圖
接下來,不用截圖說明會返回的信息了,而直接粘貼cmd里返回的字符。輸入命令會以「>」提示,看到「>」就代表此行是輸入命令並回車。
我們看到,如果只運行x264,什麼都不提供給他,x264會返回一個錯誤。他告訴我們缺少輸入文件,並提示我門輸入「x264 --help」會列出選項。照他說的,加--help試試。
>x264 --help
返回
x264 core:84 r1416 fcf70c2 Syntax: x264 [options] -o outfile infile [widthxheight] Infile can be raw YUV 4:2:0 (in which case resolution is required), or YUV4MPEG 4:2:0 (*.y4m), or Avisynth if compiled with support (yes). or libav* formats if compiled with lavf support (yes) or ffms support (yes). Outfile type is selected by filename: .264 -> Raw bytestream .mkv -> Matroska .flv -> Flash Video .mp4 -> MP4 if compiled with GPAC support (yes) Options: -h, --help List basic options --longhelp List more options --fullhelp List all options Example usage: Constant quality mode: x264 --crf 24 -o <output> <input> Two-pass with a bitrate of 1000kbps: x264 --pass 1 --bitrate 1000 -o <output> <input> x264 --pass 2 --bitrate 1000 -o <output> <input> Lossless: x264 --crf 0 -o <output> <input> Maximum PSNR at the cost of speed and visual quality: x264 --preset placebo --tune psnr -o <output> <input> Constant bitrate at 1000kbps with a 2 second-buffer: x264 --vbv-bufsize 2000 --bitrate 1000 -o <output> <input> Presets: --profile Force the limits of an H.264 profile [high] Overrides all settings. - baseline,main,high --preset Use a preset to select encoding settings [medium] Overridden by user settings. - ultrafast,veryfast,faster,fast,medium - slow,slower,veryslow,placebo --tune Tune the settings for a particular type of source or situation Overridden by user settings. Multiple tunings are separated by commas. Only one psy tuning can be used at a time. - psy tunings: film,animation,grain,psnr,ssim - other tunings: fastdecode,zerolatency Frame-type options: -I, --keyint <integer> Maximum GOP size [250] --interlaced Enable pure-interlaced mode Ratecontrol: -B, --bitrate <integer> Set bitrate (kbit/s) --crf <float> Quality-based VBR (0-51, 0=lossless) [23.0] --vbv-maxrate <integer> Max local bitrate (kbit/s) [0] --vbv-bufsize <integer> Set size of the VBV buffer (kbit) [0] -p, --pass <integer> Enable multipass ratecontrol - 1: First pass, creates stats file - 2: Last pass, does not overwrite stats file Input/Output: -o, --output Specify output file --sar width:height Specify Sample Aspect Ratio --fps <float|rational> Specify framerate --seek <integer> First frame to encode --frames <integer> Maximum number of frames to encode --level <string> Specify level (as defined by Annex A) --quiet Quiet Mode
這下返回了不少字符。x264先告訴我們他的版本號,再告訴我們他的基本用法是「x264 --output output.mkv input.avs」。還提示我們可以輸入「--longhelp」或「--fullhelp」查看詳細選項或所有的選項。
接着輸入
>x264 --fullhelp
列出了所有選項。
x264.exe的用法是,在命令行里輸入形如
x264 [--参数名 参数值 ...] --output 输出文件 输入文件 [宽x高]
- 其中方括號里是可輸入可不輸入的,「...」是可以輸很多個的意思。觀察這個形式,每個參數名之前要加「--」,空格後跟此參數名的參數值;一定要有「--output」並指定輸出文件;一定要指定輸入文件,但前面沒有「--」之類的提示符號,輸入文件後可以跟文件的解像度(「寬x高」),有時也可以不指定解像度。
此外,還有短參數模式。這是為了簡化某些常用參數名設計的。一個「-」加一個字母構成一個短參數名,和與之對應的普通參數名效果一樣。注意此時這個字母區分大小寫。在--fullhelp列表裏,有短參數的參數的短參數都列在此參數的前面。
實際命令實例:
>x264 --crf 22 --profile main --tune animation --preset medium --b-pyramid none -o psp.mp4 ep01.avs
調用x264編碼當前目錄下的"ep01.avs"文件,輸入"psp.264"。
>"D:\encoder tools\x264.exe" --crf 18 --tune touhou --preset slower -I 24 -o "D:\touhou\out.mkv" "D:\touhou\yyc\yyc.avi"
這個例子中,x264.exe、和輸入文件都不在當前目錄下,也不輸出到當前路徑,就要寫完整的路徑,如果有空格就需要在完整的路徑左右加上引號。
在Windows XP和Windows 7中,把文件拖拽到cmd里,cmd會自動把文件的完整路徑寫在命令行上的。
x264的輸入輸出文件類型
在加入了ffms/lavf後,x264可以直接輸入幾乎所有類型的片子,而不是像原來一樣必須藉助於avs。下面所講的是輸入輸出的片子類型,除此之外的輸入輸出還有多pass中的stats文件、qp file、量化矩陣和tc file。
- 輸入:
x264支持輸入的文件類型有raw yuv、y4m、avs和任何可以由ffms或lavf打開的文件。raw yuv會用在64位的x264里。有ffms/lavf打開的片子會自動正確的處理vfr問題。avs和ffms/lavf輸入不需要指定片子的解像度。
- 輸出:
x264可以輸出沒有封裝的H.264視頻流,擴展名是.264;matroska視頻,擴展名是.mkv;flash視頻,擴展名是.flv;mp4視頻,擴展名是.mp4。mkv、mp4和flv可以是vfr的。
x264通過輸出文件的擴展名判斷輸出文件類型。
x264的preset和tune系統
x264的參數繁多,開發者為了方便使用者、簡化輸入和提出編碼建議,設計了一套快速調用參數的系統。如果沒有特別的需要,請儘量使用preset和tune系統。這套開發者推薦的參數比各種道聽途說的參數更合理。
在使用了preset和tune以後,依然可以指定裏面已經有的參數。手動指定的參數會覆蓋preset和tune里的參數。
--preset
通過--preset的參數調節編碼速度和質量的平衡。
--preset的值有ultrafast、superfast、veryfast、fast、medium、slow、slower、veryslow、placebo。從快到慢,參數越來越EP。默認是medium。
--tune
通過--tune的參數值指定片子的類型,是和視覺優化的參數,或有特別的情況。
--tune的值有
- film:電影、真人類型;
- animation:動畫;
- grain:需要保留大量的grain時用;
- stillimage:靜態圖像編碼時使用;
- psnr:為提高psnr做了優化的參數;
- ssim:為提高ssim做了優化的參數;
- fastdecode:可以快速解碼的參數;
- zerolatency:零延遲,用在需要非常低的延遲的情況下,比如電視電話會議的編碼。
碼率控制
視頻的碼率直接影響到了片子的編碼質量。要想效果好,碼率足夠是最重要的必要條件之一。但是想實現更好的效果和控制文件的體積(碼率)之間始終是一對矛盾。這就需要我們通過實踐,在強大的編碼器的幫助下總結出合適的碼率,實現儘量好的效果。
x264有4種碼率控制方式,分別是1pass bitrate、crf、qp和2pass bitrate。其中2pass bitrate包含pass bitrate。
1pass bitrate和qp(恆定量化值)一般不推薦使用。
crf
--crf 23 (默認)
一種根據片子質量自動分配碼率的vbr碼率控制方式。一遍編碼,如果對碼率沒要求請儘量使用crf模式。
可用的值從1到51,越小編碼質量越好,碼率越高。一般使用16到24,可以為浮點。
crf並不是恆定質量的方式,同一片子同一crf值,其他參數不同可能碼率和質量能差比較大,不同的片子之間就更沒有可比性了。
2pass bitrate
這種方式可以精確的得到想要的平均碼率,2pass代表需要做2次編碼,第一遍編碼x264先分析全片,得到一個stats文件和一個mbtree文件(默認使用mbtree)。第二遍編碼以這兩個文件作參考分配合理的碼率。需要特定的碼率(或文件大小)一定要用2pass(或多pass)編碼。
除了2pass,還有多pass模式,在之前分析的基礎上再繼續分析,理論上會使碼率分配更加合理,但實際上2pass已經足夠了。
--bitrate 1000 (以1000kbps碼率為例)
x264 --bitrate 1000 --pass 1 --tune animation --preset slower --stats "1pass.stats" -o NUL input.avs x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output.264 input.avs
- 先輸入第一行,等1pass跑完之後再輸入第二行跑2pass。1pass主要為了得到1pass.stats和1pass.stats.mbtree兩個文件,2pass需要這兩個文件已完成最後的編碼,最後輸出文件。
- 默認情況下,1pass是以「快速」參數跑的,而不是以指定的參數跑。因此一般1pass會比2pass的速度快上很多。而這裏1pass指定輸出的文件名是NUL,在Windows里,這個文件名是保留的,因此不會有任何輸出的以編碼的文件。
- 儘量讓1pass和2pass的視頻一致,如果改變了視頻,分析的結果就會變得比較不準確。
此外,1pass可以用crf方式跑,而且可以輸出編碼的結果,也就是說先跑個1pass看看,如果大小和預想的偏差太多,就再跑個2pass。但由於1pass默認用「快速」參數跑,因此這裏的1pass需要加上--slow-firstpass強制x264用我們給的參數跑。
x264 --crf 20 --pass 1 --slow-firstpass animation --preset slower --stats "1pass.stats" -o output1pass.264 input.avs x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output2pass.264 input.avs
- 1pass會輸出3個文件:1pass.stats、1pass.stats.mbtree和output1pass.264。前兩個是分析文件,後一個是編碼的結果。如果對編碼結果不滿意,則繼續用分析的結果跑2pass。
- 2pass必須用bitrate模式跑,不能用crf跑。
64bit的x264
如果用了64位的Windows Vista或Windows 7,就可以用64位的x264。64位的x264大約能比32位的x264快上10%左右,能節省的時間還是比較可觀的。但是用AviSynth輸入時,64位的x264隻接受64位的AviSynth輸入,32位的x264隻接受32位的AviSynth。雖然現在有64位的AviSynth和不少常用的濾鏡,但是大多數人還是願意用32位的AviSynth。那麼如何用讓64位的x264配合32位的AviSynth呢?
方法是用pipe。用命令行工具(如ffmpeg、mencoder或avs2uv)打開avs,讓輸出的raw yuv畫面直接輸入給x264,期間不產生中間文件。這個操作也是在命令行里實現的。
用ffmpeg輸入
先下載ffmpeg的Windows編譯版,可以用static link版本。目前ffmpeg在Windows只有32位的編譯版。和x264一樣,ffmpeg放在任何目錄里都能運行,假設和x264、要進行編碼的input.avs(解像度是1280x720)放在一個目錄里。
>ffmpeg -i input.avs -pix_fmt yuv420p -an - | x264 [options] --input-res 1280x720 --input-csp yv12 -o output.264 -
先用ffmpeg打開input.avs,並不指定輸出的文件,而是以「-」代替輸出的文件。後面寫「|」,再寫x264,x264的選項和輸出文件寫法不變,但是輸入文件寫「-」,最後一定要指定解像度。解像度不能寫錯,不然編碼速度極慢,而且畫面出錯。如果在編碼時發現速度極慢,就要看看是不是解像度搞錯了。
用mencoder輸入
mencoder有很多有價值的濾鏡,用起來也很方便。libx264可以編譯進mencoder本身,和單獨的x264效果一樣。mencoder也可以打開avs文件,pipe給64位的x264。mplayer-ww的命令行版裏帶就有mencoder。
同樣假設mencoder、x264和要編碼的的input.avs(1280x720)在一個目錄里。
>mencoder input.avs -vf fmt=yv12 -of rawvideo -ovc raw -nosound -o - | x264 [options] --input-res 1280x720 --input-csp yv12 -o output.264 -
mencoder部分不同,x264部分和用ffmpeg時一樣。
用avs2yuv輸入
avs2yuv本來是為了給linux上wine來用的,因為AviSynth是運行在Windows的,在linux里必須wine avs2yuv來打開avs,再pipe給x264。當然也可以用來pipe給64位的x264。
同樣假設mencoder、x264和要編碼的的input.avs(1280x720)在一個目錄里。
>avs2yuv input.avs -raw -o - | x264 [options] --input-res 1280x720 --input-csp yv12 -o output.264 -
以上介紹了3種方法,個人比較傾向於用ffmpeg。2pass的編碼也是像上面所講的方法一樣。
DXVA
DXVA(DirectX Video Accelaration)通常被稱為硬解,是在Windows上用顯卡解碼H.264等編碼視頻的方式。AMD的顯卡方面,HD2xxx以上的系列都可以DXVA;nVidia的顯卡方面,GeForce8000以上的系列都可以DXVA。
符合一定條件的H.264編碼的片子才能正常的DXVA。由於H.264的複雜性,用比較老的CPU解碼720p和1080p通常比較吃力,因此720p和1080p的片子能否DXVA常常成為矛盾的焦點。為了讓大多數人都能正常的看到片子,建議儘量使用能夠DXVA的參數壓制。
隨着顯卡驅動程序的完善,DXVA(硬解) H.264視頻的限制條件也越來越少。無論是A卡還是N卡,現在都可以DXVA L5.1@HiP,ref=16的片子,但是不能保證完全沒解碼錯誤,特別是在A卡上。由於DXVA的需求主要集中在720p和1080p上,SD的視頻一般CPU都無壓力,因此講解一下針對高清片子的「安全DXVA」參數。