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