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編碼出的視頻(一般是mkv或者mp4格式)一定會比rmvb畫質更好(264高級參數發揮的作用)。還有請扔掉“mkv版一定會很大,rmvb一定會很小”的錯誤觀念,一般來說用于收藏的mkv版才會很大!
接上補充-x264是一種編碼方式-而RMVB是一種封裝格式完全沒有可比性-常見的編碼方式和封裝格式有
h263:FLV
x264:MP4/MKV/F4V
R10/R9/R40:RMVB/RM
XVID/DIVX:AVI
如果對結論有所懷疑,可以自行做實驗對比,但是必須保證條件公平,即輸入編碼器的視頻(片源)必須相同,對畫面所做的處理必須相同(也就是不可以一個銳化一個不銳化這樣的),輸出的視頻的碼率必須相同或者相差極小。因為要對比的是x264與編碼rmvb的軟件,對照實驗應該盡可能排除其他因素的幹擾
主要特點
■-8x8與4x4自适應空間域轉換
■-自适應B幀選擇
■-B幀可作為參考幀/自由的幀順序
■-CAVLC/CABAC熵編碼
■-自定義精确的矩陣模闆
■-I幀:所有宏塊格式(16x16,-8x8,-4x4,-以及有全部預測的PCM)
■-P幀:所有的分割塊(從16x16到4x4)
■-B幀:分割塊從16x16到8x8(包括skip/direct)
■-隔行掃描(MBAFF)
■-多個參考幀
■-碼率控制:固定量化,固定質量,一次或者多次編碼的平均碼率,可選的VBV參數
■-場景變換檢測
■-B幀時間域、空間域direct模式自适應選擇
■-可在多個CPU平行編碼
■-預測性的無損編碼(x264似乎也是所有基于H.264标準的編碼器中唯一實現這項的)
■-心理視覺優化,保留更多的細節(自适應量化,psy-RD,psy-trellis)
■-可用于手動調整碼率分配的zones參數
使用介紹
命令行界面的x264
我們下載到的x264.exe是一個命令行工具,不需要安裝,随便放在哪裡都能運行。雙擊x264.exe隻能看到打開了一個黑色的窗口裡在刷着什麼,然後就沒了。x264.exe需要在命令行裡輸入命令,沒有GUI。
不可否認有GUI的工具用來很方便,更容易上手,比如用的最廣泛的MeGUI,此外還有ripbot、staxrip等GUI。doom9上有都是各種GUI,一一試過來看看自己喜歡什麼。MeGUI可以自動更新編碼常用的軟件,作為自動下載的工具倒是不錯。本文主要講解命令行參數,GUI也是調用同一個x264,因此都用對應的選項。
基本用法
x264.exe的用法是,在命令行裡輸入形如
>x264-[--參數名-參數值-...]---output-輸出文件-輸入文件
其中方括号裡是可輸入可不輸入的,“...”是可以輸很多個的意思。觀察這個形式,每個參數名之前要加“--”,空格後跟此參數名的參數值;一定要有“--output”并指定輸出文件;一定要指定輸入文件,但前面沒有“--”之類的提示符号。
此外,還有短參數模式。這是為了簡化某些常用參數名設計的。一個“-”加一個字母構成一個短參數名,和與之對應的普通參數名效果一樣。注意此時這個字母區分大小寫。
要查看x264的幫助,輸入x264---help。輸入x264---longhelp查看更詳細的幫助,--fullhelp是查看全部幫助
實際命令實例:
>x264---crf-22---profile-main---tune-animation---preset-medium---b-pyramid-none--o-psp.264-ep01.avs
調用x264編碼當前目錄下的"ep01.avs"文件,輸出"psp.264"。
>"D:encoder-toolsx264.exe"---crf-18---tune-touhou---preset-slower--I-24--o-"D:touhouout.mkv"-"D:touhouth9rec.avi"
這個例子中,x264.exe、和輸入文件都不在當前目錄下,也不輸出到當前路徑,就要寫完整的路徑,如果有空格就需要在完整的路徑左右加上引号。
在Windows-XP和Windows-7中,把文件拖拽到cmd裡,cmd會自動把文件的完整路徑寫在命令行上的。
輸入輸出文件類型
在加入了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通過輸出文件的擴展名判斷輸出文件類型。
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和2passbitrate。其中2pass-bitrate包含npass-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跑。
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的參數壓制。
編碼開發作者
x264-Team-成員:
Laurent-Aimar
Loren-Merritt
Eric-Petit-(OS-X)
Min-Chen-(vfw/asm)
Justin-Clay-(vfw)
Måns-Rullgård
Radek-Czyz
Christian-Heine-(asm)
Alex-Izvorski
Alex-Wright
獲得獎項
2005年-赢得Doom9's-2005-codec-shoot-out獎項
2006年-在第3屆MSU-MPEG-4-AVC/H.264視頻編碼比賽中獲獎
2007年-在第4屆MSU-MPEG-4-AVC/H.264視頻編碼比賽中獲獎