x264編碼指南——碼率控制


 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的視頻。


原文地址:http://blog.csdn.net/vblittleboy/article/details/8982857

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章