ffmpeg:碼率控制模式、編碼方式

碼率控制模式

碼率控制:碼率控制是在決定爲每一個幀畫面分配多少比特數,這是在權衡文件體積和畫面質量
在ffmpeg裏支持一下三種碼率控制模式:

-qp(constant quantizer恆定量化器模式)

所謂的量化器就是利用特殊算法將畫質轉化爲數字,這樣的話每一幀的畫質都可以通過量化參數來判定。在qp模式下,畫質被分爲0…20…40…51個級別,0就是無損的畫質。用qp壓制視頻,每一幀的畫面都能達到該級別的質量,嚴格的遵循量化參數來編碼,這麼一來他的畫質是最好的,體積也是最大的,大到你無法想象,所以我們都不採用這種碼率控制模式。

除非你想無損壓制視頻
無損壓縮的例子(快速編碼)

ffmpeg -i input.mkv -vcodec libx264 -preset ultrafast -qp 0 output.mkv

無損壓縮的例子(高壓縮比)

ffmpeg -I input.mkv -vcodec libx264 -preset veryslow -qp 0 output.mkv

-vcodec libx264】指定編碼器libx264
-preset veryslow】設置編碼器預設爲veryslow
-qp 0】設置碼率控制模式採用恆定量化器模式,並且畫質爲無損的畫質

-crf(constant rate factor恆定速率因子模式)

crf其實是一個浮動的qp模式,他按照特定的標準,根據人體肉眼的特點,給予每幀畫面不同的量化參數,有些畫面畫質低一點,有些畫面畫質高一點其實人眼是很難識別的。所以我們可以降低一點碼率,然後把這些碼率用到視覺敏感的畫面裏,這麼一來,畫質的變化幾乎看不出來,碼率卻降低了不少,文件體積自然也變小了

-b(bitrate固定目標碼率模式)

編碼器會試圖讓最終文件的整體碼率與我們給定的碼率相等,這麼一來視頻碼率和文件體積都是確定的,適用於對碼率和體積有規定的情景。一般情況下現在大部分的視頻軟件都有這方面的限制,如果你們有上傳視頻的需求,並且希望在有限的條件下達到較高的畫質,那麼就可以採用這種碼率控制模式。但爲什麼要這麼做呢?我們利用crf壓制一個足夠清晰,體積適中的視頻文件,無論是用於存儲還是上傳都可以,不同的視頻網站有不同的參數限制,而且基本上他們都會二次壓制後轉碼,爲了追求那麼一點點畫質,針對不同網站分別壓制視頻,實在是太浪費時間了,如果那些網站的參數變動的話,我們怎麼辦,又要重新壓制嘛,所以基本上我們不採用這種碼率控制模式。除非是壓制極小的視頻,或者是對視頻文件大小有嚴格限制的場景。

以上三種碼率控制均是單遍編碼,所以在採用qp或者crf的時候,最好搭配編碼器預設veryslow,這樣一來參數控制更精準一些。

編碼方式

VBR(variable bit rate)

bitrate固定目標碼率模式默認採用的是VBR動態(可變)比特率的方式進行編碼,簡單的內容少給點碼率,複雜的內容多給點碼率。
VBR例子:ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow output.mp4

ABR(average bit rate)

現在的網絡視頻基本上都是採用ABR平均比特率的編碼方式,如果VBR的碼率變化太大,用戶的設備或網絡狀況又不好的情況下很容易變成花屏或者黑屏。
ABR例子:ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow -b:v 3000k output.mp4

CBR(constant bit rate)

CBR恆定比特率,他其實就是在ABR的基礎上加上一些指令(…-b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k…)讓碼率儘可能固定在一個數值上。

那麼ffmpeg如何控制碼率?

ffmpeg控制碼率有3種參數選擇,-minrate -b:v -maxrate
-b:v】主要是控制平均碼率
比如一個視頻源的碼率太高了,有10Mbps,文件太大,想把文件弄小一點,但是又不破壞分辨率。可以如下操作:

ffmpeg -i input.mp4 -b:v 2000k output.mp4

這個操作把碼率從原碼率10Mbps轉成2Mbps碼率,這樣其實也間接讓文件變小了。目測接近一半。

不過,ffmpeg官方wiki比較建議,設置b:v時,同時加上 -bufsize
-bufsize 】用於設置碼率控制緩衝器的大小,設置的好處是,讓整體的碼率更趨近於希望的值,減少波動。(簡單來說,比如1 2的平均值是1.5, 1.49 1.51 也是1.5,當然是第二種比較好)

ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4

-minrate -maxrate】就簡單了,在線視頻有時候,希望碼率波動,不要超過一個閾值,可以設置maxrate。

ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章