ffmpeg與x264編碼指南

來源:互聯網
上載者:User

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



















聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.