「X264使用介绍」修訂間的差異

出自NMM Doc
跳至導覽 跳至搜尋
行 42: 行 42:


 假设x264.exe在E:\Encoder\文件夹,输入
 假设x264.exe在E:\Encoder\文件夹,输入
  cd /D E:\Encoder
  >cd /D E:\Encoder


 回车
 回车
行 49: 行 49:


 改变当前目录到E:\Encoder了。接下来,输入
 改变当前目录到E:\Encoder了。接下来,输入
  x264
  >x264
 回车
 回车


行 152: 行 152:


x264.exe的用法是,在命令行里输入形如
x264.exe的用法是,在命令行里输入形如
  x264 [--参数名 参数值 ...] --output 输出文件 输入文件 [宽x高]
  >x264 [--参数名 参数值 ...] --output 输出文件 输入文件 [宽x高]


:其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号,输入文件后可以跟文件的分辨率(“宽x高”),有时也可以不指定分辨率。
:其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号,输入文件后可以跟文件的分辨率(“宽x高”),有时也可以不指定分辨率。
行 225: 行 225:


--bitrate 1000 (以1000kbps码率为例)
--bitrate 1000 (以1000kbps码率为例)
  x264 --bitrate 1000 --pass 1 --tune animation --preset slower --stats "1pass.stats" -o NUL input.avs
  >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
  >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跑完之后再输入第二行跑2pass。1pass主要为了得到1pass.stats和1pass.stats.mbtree两个文件,2pass需要这两个文件已完成最后的编码,最后输出文件。
行 234: 行 234:
 此外,1pass可以用crf方式跑,而且可以输出编码的结果,也就是说先跑个1pass看看,如果大小和预想的偏差太多,就再跑个2pass。但由于1pass默认用“快速”参数跑,因此这里的1pass需要加上--slow-firstpass强制x264用我们给的参数跑。
 此外,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 --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
  >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。
:1pass会输出3个文件:1pass.stats、1pass.stats.mbtree和output1pass.264。前两个是分析文件,后一个是编码的结果。如果对编码结果不满意,则继续用分析的结果跑2pass。

於 2010年8月8日 (日) 18:22 的修訂

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

我們一般選擇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和任何可以由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、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」參數。


待補充


PSP上的480p H.264編碼的mp4片子