h264的位元速率控制模式介紹

2022-07-10 18:54:12 字數 3933 閱讀 1049

位元速率控制有多種方式,你將會了解到"1-pass","2-pass","cbr","vbr","vbv encoding"和"crf"等。

下面是不同位元速率控制模式的簡單示例,它告訴你作為終端使用者應該在什麼時候用什麼模式。注意這裡不包含rdo的具體細節。

很多人可能更熟悉音訊編碼器,尤其是那些經歷了***年代的人。不過從cd的發展史來說,最開始使用固定位元速率(constant bitrate,cbr)編碼,後來發展出了可變位元速率(variable bitrate,vbr)。vbr可以確保在給定限制下使用最少的位元情況下保持最高質量。

選擇哪種位元速率控制模式往往取決於你的應用場景。通常有以下幾種常見場景:

存檔:壓縮乙個檔案存到硬碟或網盤上。這時你希望檔案編碼後質量盡可能好同時位元速率盡可能低,但是你不關心壓縮後檔案的具體大小。

面向裝置的編碼:例如你想向***或藍光碟上存放檔案,你想使檔案編碼後達到特定大小(正好佔滿碟片空間)。

了解使用場景可以幫助你選擇位元速率控制模式。

下面介紹不同的位元速率控制模式,這些模式基於ffmpeg中的x264,x265和libvpx編碼器。你可以在ffmpeg文件找到詳細引數介紹。

注意:編碼器預設不會「填塞」位元。意味著,當編碼簡單的幀時,實際使用位元可能低於設定的位元,這時編碼器不會浪費位元強行達到設定位元。

量化引數(quantization parameter,qp)控制著壓縮大小。qp越大壓縮率越高同時質量越低,qp越小壓縮率越低同時質量越高。在h.264和h.265中,qp的範圍是0-51間的整數。你可以很容易的在x264和x265中設定固定qp來編碼。注意:libvpx沒有固定qp模式。

ffmpeg -i -c:v libx264 -qp 23

ffmpeg -i -c:v libx265 -x265-params qp=23

除非你明確的知道你想要做什麼,否則不要使用這個模式。採用cqp模式會導致根據場景複雜度不同位元率波動很大,你無法控制實際位元率。

壞處:幾乎其他所有應用。

下面是給定編碼器乙個目標位元速率,編碼器計算如何達到這個位元速率:

ffmpeg -i -c:v libx264 -b:v 1m

ffmpeg -i -c:v libx265 -b:v 1m

ffmpeg -i -c:v libvpx-vp9 -b:v 1m

避免使用這個模式!x264的主要開發者之一說你應該永遠不要使用它。為什麼?因為編碼器不知道後面還未編碼的內容,所以它不得不猜測如何達到給定位元速率。這意味著位元速率要一直變化,尤其是在開始時。對於 has-type流,這會導致在短時間內質量巨大波動。

abr不是一種恆定位元速率模式而是可變位元速率模式。

好處:快速編碼。

壞處:幾乎其他所有應用。

通過設定nal-hrd可以使編碼器強制保持在特定位元速率。

ffmpeg -i -c:v libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v 1m -minrate 1m -maxrate 1m -bufsize 2m 

對於vp9使用cbr的命令如下:

ffmpeg -i -c:v libvpx-vp9 -b:v 1m -maxrate 1m -minrate 1m 

壞處:文件儲存;高效使用頻寬的場景。

如果允許編碼器兩遍(或更多)編碼那麼它就可以預先估計未來還未編碼的內容。它可以在第一遍編碼是計算編碼代價,然後在第二遍編碼是更高效的利用位元。這種模式使得在特定位元速率下輸出的質量最好。

對於x264:

ffmpeg -i -c:v libx264 -b:v 1m -pass 1 -f null /dev/null

ffmpeg -i -c:v libx264 -b:v 1m -pass 2 .mp4

對於x265:

ffmpeg -i -c:v libx265 -b:v 1m -x265-params pass=1 -f null /dev/null

ffmpeg -i -c:v libx265 -b:v 1m -x265-params pass=2 .mp4

對於vp9:

ffmpeg -i -c:v libvpx-vp9 -b:v 1m -pass 1 -f null /dev/null

ffmpeg -i -c:v libvpx-vp9 -b:v 1m -pass 2 .webm

這是對流進行編碼的最簡單的方法。但有兩點注意:你不知道最終結果的質量如何,所以你必須進行多次實驗以確保給定的位元速率足夠編碼複雜內容。另一點是這種模式位元速率可能出現區域性峰值,意味著傳送能力可能超過客戶端的接受能力。對於位元速率的選擇,你可以參考youtube的推薦設定,但是注意這些都是為了讓你上傳高質量的**而優化的,實際中你可以選擇更低的位元速率。

好處:達到特定位元速率;面向裝置的編碼。

壞處:如果你需要快速編碼(例如,直播流)。

ffmpeg -i -c:v libx264 -crf 23

ffmpeg -i -c:v libx265 -crf 28

ffmpeg -i -c:v libvpx-vp9 -crf 30 -b:v 0

在h.264和h.265中,crf取值為0到51間的整數(和qp類似)。x264預設值是23,x265預設值是28。crf增減6會導致位元速率減半或加倍。對於vp9,crf取值範圍0到63,推薦值為15-35。

這種模式缺點是無法確定最終檔案的位元速率和位元速率波動。

好處:文件儲存;達到盡可能好的質量。

壞處:流**;需要特定位元速率(或檔案大小)。

對於vbv可以確保位元速率不超過某個最大值。這對於流**非常有用,你現在可以確定你不會傳送比你承諾的更多的位元。vbv可以和2-pass vbr(在兩遍編碼中都使用)或crf一起使用。

ffmpeg -i -c:v libx264 -crf 23 -maxrate 1m -bufsize 2m

ffmpeg -i -c:v libx265 -crf 28 -x265-params vbv-maxrate=1000:vbv-bufsize=2000

vp9有類似的模式,不叫vbv,但是原理一樣:

ffmpeg -i -c:v libvpx-vp9 -crf 30 -b:v 2m 

如果你在直播流中應用vbv,且你想加速編碼過程,你可以使用-tune zerolatency和-preset ultrafast選項。這會犧牲一部分質量來加速編碼。

在受約束的abr-vbv中使用這種模式:

ffmpeg -i -c:v libx264 -b:v 1m -maxrate 1m -bufsize 2m -pass 1 -f null /dev/null

ffmpeg -i -c:v libx264 -b:v 1m -maxrate 1m -bufsize 2m -pass 2

對x265:

ffmpeg -i -c:v libx265 -b:v 1m -x265-params pass=1:vbv-maxrate=1000:vbv-bufsize=2000 -f null /dev/null

ffmpeg -i -c:v libx265 -b:v 1m -x265-params pass=2:vbv-maxrate=1000:vbv-bufsize=2000

對vp9:

ffmpeg -i -c:v libvpx-vp9 -b:v 1m -maxrate 1m -bufsize 2m -pass 1 -f null /dev/null

ffmpeg -i -c:v libvpx-vp9 -b:v 1m -maxrate 1m -bufsize 2m -pass 2

如何設定bufsize?這取決於你期望位元速率的波動情況。乙個好的設定方法是將bufsize設為maximum rate的兩倍。如果客戶端快取比較小,設定bufsize等於maxrate。如果你想限制碼流的位元速率,設定bufsize為maximum rate的一半或更小。

好處:頻寬受限的流**;直播流(使用crf,1-pass);vod流。

壞處:文件儲存。

H 264的位元速率控制演算法

h 264中的jvt g012演算法採用的二次r q模型如下 這一模型用於基本單元的量化引數計算,其中r代表編碼量化係數所需的碼字位數,q指基本單元的量化步長,mad通過以下線性 模型進行 其中madcb和madpb代表當前基本單元和前一幀相應位置處的mad,a1,a2是模型係數,在每乙個基本單元的...

h 264位元速率控制

h.264的碼流傳輸是基於目前有限的網路頻寬來進行的,以目前的壓縮效率來說,運動不算劇烈 細節不多的影像,在720p的情況下,1000kbps壓縮損耗較少 psnr較大 能達到比較好的觀賞效果,1080p則需要2000kbps。當然,隨著影象運動劇烈程度加大,細節增多的情況,則需要更大的bps來保證...

h 264位元速率控制

h.264的碼流傳輸是基於目前有限的網路頻寬來進行的,以目前的壓縮效率來說,運動不算劇烈 細節不多的影像,在720p的情況下,1000kbps壓縮損耗較少 psnr較大 能達到比較好的觀賞效果,1080p則需要2000kbps。當然,隨著影象運動劇烈程度加大,細節增多的情況,則需要更大的bps來保證...