X264使用介紹

從 NMM Doc
跳到: 導覽搜尋

x264是一個開源的H.264視頻編碼函數庫。是最好的有損視頻編碼器。

主頁: http://www.videolan.org/developers/x264.html

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平台的編譯版。

命令行界面的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:104 r1688M 0b36c6d
Syntax: x264 [options] -o outfile infile

Infile can be raw (in which case resolution is required),
  or YUV4MPEG (*.y4m),
  or Avisynth if compiled with support (no).
  or libav* formats if compiled with lavf support (no) or ffms support (yes).
Outfile type is selected by filename:
 .264 -> Raw bytestream
 .mkv -> Matroska
 .flv -> Flash Video
 .mp4 -> MP4
Output bit depth: 8 (configured at compile time)

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>

中间略...

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

Filtering:

      Filter options may be specified in the name=value format
--vf, --video-filter <filter0>/<filter1>/... Apply video filtering to the input file
      Available filters:
      crop:left,top,right,bottom
      resize:[width,height][,sar][,fittobox][,csp][,method]
      select_every:step,offset1[,...]


這下返回了不少字符。x264先告訴我們他的版本號,再告訴我們他的基本用法是「x264 [options] -o outfile infile」。還提示我們可以輸入「--longhelp」或「--fullhelp」查看詳細選項或所有的選項。

接着輸入

>x264 --fullhelp

列出了所有選項。

x264.exe的用法是,在命令行里輸入形如

>x264 [--参数名 参数值 ...] --output 输出文件 输入文件
其中方括號里是可輸入可不輸入的,「...」是可以輸很多個的意思。觀察這個形式,每個參數名之前要加「--」,空格後跟此參數名的參數值;一定要有「--output」並指定輸出文件;一定要指定輸入文件,但前面沒有「--」之類的提示符號。

此外,還有短參數模式。這是為了簡化某些常用參數名設計的。一個「-」加一個字母構成一個短參數名,和與之對應的普通參數名效果一樣。注意此時這個字母區分大小寫。在--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\th9\rec.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和任何可以由ffmslavf打開的文件。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、faster、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 --tune 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或avs2yuv)打開avs,讓輸出的raw yuv畫面直接輸入給x264,期間不產生中間文件。這個操作也是在命令行里實現的。

用ffmpeg輸入

先下載ffmpeg的Windows編譯版,可以用static link版本。目前ffmpeg在Windows只有32位的編譯版。和x264一樣,ffmpeg放在任何目錄里都能運行,假設和x264、要進行編碼的input.avs放在一個目錄里。

>ffmpeg -i input.avs -f yuv4mpegpipe -an -v 0 - | x264 [options] --demuxer y4m -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 format=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。

同樣假設avs2yuv、x264和要編碼的的input.avs在一個目錄里。

>avs2yuv input.avs - | x264 [options] --demuxer y4m -o output.264 -

avs2yuv的輸出格式默認是yuv4mpeg,x264用y4m格式解碼即可從中讀取解像度,所以無須再用--input-res指定解像度。

以上介紹了3種方法,個人比較傾向於用ffmpeg。2pass的編碼也是像上面所講的方法一樣。

x264壓制的自動化

雖然MeGUI等程序實現了x264壓制的批量化,但並無法實現crf 1st pass + bitrate 2nd pass的自動2pass,也無法實現1st pass和2nd pass使用不同avs腳本。

為此SAPikachu編寫了Python腳本encx264,實現了以下功能:

  • 支持1Pass crf + 2Pass bitrate模式,自動獲取crf出來的碼率作為2pass參數。也可設定2pass碼率的比例,自動計算2nd pass碼率功能。
  • 自動記錄壓制log。
  • 可自定義多套預置參數。
  • 可分別使用不同腳本跑1st和2nd pass。如1st pass使用較快的濾鏡,2nd pass再使用速度慢效果好的濾鏡,犧牲一定精度來提高速度。
  • 支持腳本自動升級最新版。

下載、討論、反饋請前往論壇討論發佈專用貼

DXVA

參考主條目: DXVA和psp

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的參數壓制。