x264是一個(gè) H.264/MPEG4 AVC 編碼器,本指南將指導(dǎo)新手如何創(chuàng)建高質(zhì)量的H.264視頻。
對于普通用戶通常有兩種碼率控制模式:crf(Constant Rate Factor)和Two pass ABR。碼率控制是一種決定為每一個(gè)視頻幀分配多少比特?cái)?shù)的方法,它將決定文件的大小和質(zhì)量的分配。
如果你在編譯和安裝libx264 方面需要幫助,請查看ffmpeg和x264編譯指南:
http://ffmpeg.org/trac/ffmpeg/wiki/CompilationGuide
crf(Constant Rate Factor):
該方法在輸出文件的大小不太重要的時(shí)候,可以使整個(gè)文件達(dá)到特定的視頻質(zhì)量。該編碼模式在單遍編碼模式下提供了最大的壓縮效率,每一幀可以按照要求的視頻質(zhì)量去獲取它需要的比特?cái)?shù)。不好的一面是,你不能獲取一個(gè)特定大小的視頻文件,或者說將輸出位率控制在特定的大小上。
1 選擇一個(gè)CRF值
量化比例的范圍為0~51,其中0為無損模式,23為缺省值,51可能是最差的。該數(shù)字越小,圖像質(zhì)量越好。從主觀上講,18~28是一個(gè)合理的范圍。18往往被認(rèn)為從視覺上看是無損的,它的輸出視頻質(zhì)量和輸入視頻一模一樣或者說相差無幾。但從技術(shù)的角度來講,它依然是有損壓縮。
若Crf值加6,輸出碼率大概減少一半;若Crf值減6,輸出碼率翻倍。通常是在保證可接受視頻質(zhì)量的前提下選擇一個(gè)最大的Crf值,如果輸出視頻質(zhì)量很好,那就嘗試一個(gè)更大的值,如果看起來很糟,那就嘗試一個(gè)小一點(diǎn)值。
注釋:本文所提到的量化比例只適用于8-bitx264(10-bit x264的量化比例 為0~63),你可以使用x264 --help命令在Output bit depth選項(xiàng)查看輸出位深,在各種版本中,8bit是最常見的。
2 選擇一個(gè)預(yù)設(shè)
預(yù)設(shè)是一系列參數(shù)的集合,這個(gè)集合能夠在編碼速度和壓縮率之間做出一個(gè)權(quán)衡。一個(gè)編碼速度稍慢的預(yù)設(shè)會提供更高的壓縮效率(壓縮效率是以文件大小來衡量的)。這就是說,假如你想得到一個(gè)指定大小的文件或者采用恒定比特率編碼模式,你可以采用一個(gè)較慢的預(yù)設(shè)來獲得更好的質(zhì)量。同樣的,對于恒定質(zhì)量編碼模式,你可以通過選擇一個(gè)較慢的預(yù)設(shè)輕松地節(jié)省比特率。
如果你很有耐心,通常的建議是使用最慢的預(yù)設(shè)。目前所有的預(yù)設(shè)按照編碼速度降序排列為: ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo
缺省預(yù)設(shè)為medium,請忽略 placebo因?yàn)樗呛翢o用處的(參看下面的問答)。你可以使用--preset來查看預(yù)設(shè)列表,也可以通過x264 --fullhelp來查看預(yù)設(shè)所采用的參數(shù)配置。
你可以基于輸入內(nèi)容的獨(dú)特性通過使用--tune來改變參數(shù)設(shè)置。當(dāng)前的 tune包括:film,animation,grain,stillimage,psnr,ssim,fastdecode,zerolantency。假如你的壓制內(nèi)容是動畫,你可以使用animation,或者你想保留紋理,那就是用grain。如果你不確定使用哪個(gè)選項(xiàng)或者說你的輸入與所有的tune皆不匹配,你可以忽略--tune 選項(xiàng)。你可以使用--tune來查看tune列表,也可以通過x264 --fullhelp來查看tune所采用的參數(shù)配置。
另外一個(gè)可選的參數(shù)是--profile,它可以將你的輸出限制到一個(gè)特定的 H.264 profile,該選項(xiàng)可以被忽略除非你的播放設(shè)備只支持某種profile。當(dāng)?shù)乃衟rofile 包括:baseline,main.high,high10,high422,high444 。注意使用--profile選項(xiàng)和無損編碼是不兼容的。
如下所示,作為一種快捷方式,你可以通過不聲明 preset和tune得內(nèi)容來為ffmpeg羅列所有可能的內(nèi)部preset和tune。
ffmpeg -i input -c:v libx264 -preset -tune dummy.mp4
3 使用你的預(yù)設(shè)
一旦你選擇了一個(gè)預(yù)設(shè),請把它應(yīng)用到你的剩余的尚未編碼的視頻,這樣可以確保它們有同樣的視頻質(zhì)量。
CRF例子:
接下來將使用x264編碼一個(gè)視頻,使用一個(gè)比普通預(yù)設(shè)稍慢的預(yù)設(shè),這樣可以得到比默認(rèn)設(shè)置稍好一點(diǎn)的視頻質(zhì)量。
ffmpeg -i input -c:v libx264 -preset slow -crf 22-c:a copy output.mkv
注意在這個(gè)例子中,輸入文件的音頻流被簡單地拷貝到輸出,并沒有重編碼。
兩遍模式:
如果你的目標(biāo)是一個(gè)確定大小的文件而且?guī)c幀之間的視頻質(zhì)量并不重要,這個(gè)方法很適用。這通過一個(gè)例子可以得到很好地解釋。你的視頻有10分鐘(600秒)的時(shí)長同時(shí)要求輸出為50MB,因?yàn)楸忍芈?文件大小/時(shí)長,
50MB*8192(MB轉(zhuǎn)kilobits)/600秒=683 kbps(全局比特率)
,683kbps-128kbps(音頻比特率)=555kbps(視頻比特率),
兩邊編碼的例子:
ffmpeg -y -i input -c:v libx264 -preset medium -b:v 555k -pass 1 -an -f mp4 /dev/null &&
ffmpeg -i input -c:v libx264 -preset medium -b:v 555k -pass 2 -c:a libfdkaac -b:a 128k mp4 output.mp4
注意 windows 用戶應(yīng)該使用NUL來取代/dev/null
當(dāng)使用CRF時(shí),請選擇使用你所能容忍的最慢預(yù)設(shè)。
同時(shí)建議你看一下《制作高質(zhì)量的 MPEG4 DVD電影視頻剪輯》,這是一篇 MPEG4 編碼器編碼指南,它會讓你深刻的了解當(dāng)你面臨存儲空間受限時(shí),兩邊編碼模式對于有效的使用每一個(gè)bit是多么的重要。
無損H.264
你可以使用-qp 0或者-crf 0 來編碼一個(gè)無損輸出,對于無損壓縮我們提倡使用-qp 勝過-crf。因?yàn)? bitx264和10 bitx264中的 crf 針對無損模式使用了不同的值。對此ultrafast和veryslow是兩個(gè)非常有用的預(yù)設(shè),因?yàn)轱w快的編碼速度和出色的壓縮比通常是兩個(gè)非常重要的因素。大部分的非 ffmpeg播放器不能播放無損模式,所以如果考慮到兼容性問題,你可能不能使用無損模式。
無損壓縮的例子(快速編碼)
ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 output.mkv
無損壓縮的例子(高壓縮比)
ffmpeg -i input -c:v libx264 -preset veryslow -qp 0 output.mkv
重寫缺省預(yù)設(shè)
你可以使用-x264opts來重寫預(yù)設(shè)或者使用 libx264的私有選項(xiàng)(可以通過ffmpeg -h來完整的查看 libx264選項(xiàng))。我們并不建議你這么做除非你知道你在做什么。所有預(yù)設(shè)均是由x264的開發(fā)者創(chuàng)建的,想通過微調(diào)參數(shù)來提高輸出質(zhì)量通常是在浪費(fèi)時(shí)間。
例子:
ffmpeg -i input -c:v libx264 -preset slow -crf 22 -x264opts keyint=123:min-keyint=20 -c:a copy output.mkv
附加信息:
ABR(Average Bit Rate)
ffmpeg -i input -c:v libx264 -b:v 1000k ....
它提供了某種“運(yùn)行均值”的目標(biāo),終極目標(biāo)是最終文件大小匹配這個(gè)“全局平均”數(shù)字(因此基本上來說,如果編碼器遇到大量碼率開銷非常小的黑幀,它將以低于要求的比特率編碼,但是在接下來幾秒內(nèi)的非黑幀它將以高質(zhì)量方式編碼方式使碼率回歸均值)使用兩邊編碼模式是這個(gè)方法變得更加有效,你可以和“max bit rate ”配合使用來防止碼率的波動。
CBR(Constant Bit Rate)
事實(shí)上根本就沒有CBR這種模式,但是你可以通過補(bǔ)充ABR參數(shù)“模擬”一個(gè)恒定比特率設(shè)置,比如:
ffmpeg -i input -c:v libx264 -b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
在這個(gè)例子中,-bufsize是一個(gè)“碼率控制緩沖區(qū)”,因此它會在每一個(gè)有用的1835k視頻數(shù)據(jù)內(nèi)強(qiáng)制一個(gè)你所要求的均值(此處為4000k),所以基本上我們會認(rèn)為接收端/終端播放器會緩沖那么多的數(shù)據(jù),因此在這個(gè)數(shù)據(jù)內(nèi)部波動是沒有問題的。
當(dāng)然,如果只有黑幀或者空白幀,它所花費(fèi)的的比特率將少于需求位率(但它會盡可能的提高質(zhì)量水平,直到crf)。
最大比特率的CRF模式
你可以通過聲明-crf和-maxrate設(shè)置來使用帶有最大比特率crf模式,比如:
ffmpeg -i input -c:v libx264 -crf 20 -maxrate 400k -bufsize 1835k
這將會有效的將crf值鎖定在20,但是如果輸出碼率超過400kbps,在這種情況下編碼器會將質(zhì)量降低到低于crf 20。
低延遲
x264提高了一個(gè) -tune zerolatency 選項(xiàng)。
兼容性:
如果你想讓你的視頻最大化的和目標(biāo)播放設(shè)備兼容(比如老版本的的ios或者所有的android 設(shè)備),那么你可以這做:
-profile:v baseline
這將會關(guān)閉很多高級特性,但是它會提供很好的兼容性。也許你可能不需要這些設(shè)置,因?yàn)橐坏┠阌昧诉@些設(shè)置,在同樣的視頻質(zhì)量下與更高的編碼檔次相比會使比特率稍有增加。
關(guān)于profile列表和關(guān)于它們的描述,你可以運(yùn)行x264 --fullhelp
要牢記apple quick time 對于x264編碼的視頻只支持 YUV 420顏色空間,而且不支持任何高于 mian profile編碼檔次。這樣對于quick time 只留下了兩個(gè)兼容選項(xiàng)baseline和 main。其他的編碼檔次qucik time均不支持,雖然它們均可以在其它的播放設(shè)備上回放。
使用-ss和-t選項(xiàng)可以編碼一個(gè)段落而不是整個(gè)視頻,這樣可以快速的了解視頻編碼輸出情況。
-ss 從起始值算起的偏移時(shí)間,這個(gè)值可以以秒為單位或者HH:MM:SS格式
-t 輸出時(shí)延,這個(gè)值可以以秒為單位或者HH:MM:SS格式
問題與解答:
1 兩遍編碼模式能夠比CRF模式提供更好的質(zhì)量嗎?
不能,但它可以更加精確地控制目標(biāo)文件大小。
2 為什么 placebo 是一個(gè)浪費(fèi)時(shí)間的玩意兒?
與 veryslow相比,它以極高的編碼時(shí)間為代價(jià)換取了大概1%的視頻質(zhì)量提升,這是一種收益遞減準(zhǔn)則,veryslow 與 slower相比提升了3%;slower 與 slow相比提升了5%;slow 與 medium相比提升了5%~10%。
3 為什么我的無損輸出看起來是無損的?
這是由于rgb->yuv的轉(zhuǎn)換,如果你轉(zhuǎn)換到y(tǒng)uv444,它依然是無損的。
4 顯卡能夠加速x264的編碼嗎?
不,x264沒有使用(至少現(xiàn)在沒有),有一些私有編碼器使用了GPU加快了編碼速度,但這并不意味著它們經(jīng)過良好的優(yōu)化。也有可能還不如x264,或許速度更慢??偟膩碚f,ffmpeg到目前為止還不支持GPU。
翻譯注釋:x264在2013版中已經(jīng)開始支持基于opencl的顯卡加速,用于幀類型的判定。
5 為Quick time 播放器壓制視頻
你需要使用-pix_fmt yuv420p來是你的輸出支持QT 播放器。這是因?yàn)閷τ贖.264視頻剪輯蘋果的Quick time只支持 YUV420顏色空間。否則ffmpeg會根據(jù)你的視頻源輸出與Quick time 不兼容的視頻格式或者不是基于ffmpeg的視頻。