CRF和CQP的區別

轉發自https://www.cnblogs.com/sunny-li/p/9979796.html

本文翻譯自 https://slhck.info/video/2017/02/24/crf-guide.html ,不當之處,請多指教。

----------------------------正文-------------------------

什麼是CRF?

CRF是264和265中默認的質量/碼率控制設置。這個值可以在0到51之間,值越低,質量越好,文件大小越大。在x264上面,一般取值爲18-28,默認值是23。在ffmpeg中,crf是這麼使用的

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

在x265中,默認的crf值是28

ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4

如果你不確定要用哪個crf的值的話,請先用默認值,然後根據你對輸出質量的主觀印象去調整。大約crf的值差別爲6就會導致文件大小的加倍或減半。

你應該在線下的文件存儲中使用crf的編碼,來獲取一個最佳的編碼方式。對於其他的使用場景,請使用其他的碼率控制模式。

------------------------------------------------------------------------------------

CRF和QP

CRF是恆定質量的編碼方式,與恆定碼率(CBR)是相反的。通常,爲了獲取恆定質量的編碼,我們可以通過用同樣的大小去壓縮每一個相同類型的幀,即,扔掉相對來說相同數量的信息。用專業術語來說,就是使用相同的量化參數QP。這個量化參數QP定義了從一個像素宏塊中丟掉多少信息。通常這將導致整個視頻序列的碼率不穩定。

不過,這裏所說的CRF比恆定量化參數要複雜一點兒。CRF會用將每一幀的壓縮不同的大小,爲了讓主觀的質量感受差不多,會用不同的QP。他是通過把運動也考慮進來做到這一點的。在編碼中,如果Qp=18,則每一幀都是QP=18,當然根據幀的類型不同會有一些微小的波動,忽略之。設置CRF=18的時候,對於運動比較大的場景,會把QP設得更高一些,對於運動比較比較不劇烈的幀,會降低QP。這會導致比特率的分配隨時間變化不同。

例如,下圖展示了兩個不同的視頻(BBB big buck bunny和TOS tears of steal),用不同的等級去編碼(17和23),分別用恆定量化參數CQP和恆定質量CRF模式

我們看到,CRF的線總是比CQP的要低,意味着採用CRF模式的時候,可以省比特數,而採用CQP的時候,稍微會浪費一點文件大小。

爲什麼運動這麼重要?

比起運動的物體,人眼對靜止的物體會觀察到更多的細節。基於這一想法,編碼時,對運動物體給更高的壓縮率,而對靜止的物體保留更多的細節。

用外行的話說,這是因爲你的視覺系統會被運動分散注意力,而不會有足夠的時間去注意運動物體的細節。用專業術語來講,運動掩蓋了塊效應。從另一個方面來說,當一幀運動不夠大時,人就會話更多的時間去注意圖像的細節了,所以你希望壓縮的越少越好。這個時候的壓縮噪聲對於人眼來說就比較顯著了。

你可能會問,那麼CQP是不是會取得好的視頻質量呢?事實上,感官感受是差不多的,只是CQP的模式會在你不真正注意的區域浪費更多的空間。

從應用的層面來說,很多人都會在單通道的編碼使用CRF,另一個採用CRF的原因是這個是開發者x264或x265時默認選擇的碼率控制模式。

 

定量的視頻質量怎麼樣呢?

如果你有一些簡單的方式可以比較視頻質量的話(比如,比較每一幀的PSNR),你會發現CRF的質量比CQP的要差。但是如果你用人眼去主觀評價的話,CRF和CQP看起來差不多。它對於人眼比較關注的地方壓縮的比較小。客觀質量評價可能會比較差,但主觀質量還是可以的。

這其實有一個對於簡單的質量評價方式psnr或ssim的一個質疑,它不能把運動之類的影響人眼的感受的因素考慮進去,因爲他們是逐幀去評價的。一些評價標準,像VQM和VMAF對於評價視頻來說是更好的一種方式。

 

質量和比特率之間是什麼關係?

不是所有的視頻都是一樣好壓縮的。運動較少,細節較少的視頻是比較容易壓縮的,反之相反了。這裏說的容易是指,同樣的碼率的情況下,比較容易達到更好的圖像質量。

CRF解決這一問題,對於不同的視頻,不同的CRF參數導致不同的碼率。事實上,你無法根據碼率估計crf的參數。

例如,你把CRF設成23,對於一個視頻源,你會得到1500 kb/s,而對於另一個,你會得到1000kb/s,兩個看起來質量差不多。事實上,CRF要做的,就是保留確定數量的細節,不管用多少碼率。

雲編碼服務Bitmovin在正式編碼之前,也用CRF來評估視頻的複雜度。

需要注意一點,如果你的CRF選的太高(比如30),你會看到在運動比較劇烈的地方有很多的塊效應,因爲這些地方的碼率太低了。編碼器會對更復雜的區域用QP32,如本文開頭提到的,根據你想要的視頻質量選擇要的CRF參數。

爲什麼你還是會在電視或者網絡上看到很多塊效應呢?

爲什麼呢?問題是對於這些視頻,他們用了太低的碼率,特別是在廣播中,碼流是用固定碼率去壓縮的,這樣就不會考慮運動了。因此,一些電視節目在真正複雜的細節的圖像處沒有采用相應的壓縮率,看起來就比較多的塊了。

現在的碼流處理會更加的智能一些。youtube和neflix用2-pass甚至3-pass的算法,對於後者來說,採用CRF編碼來決定對於某一特定源,應該用某種碼率去編碼。確保對於複雜場景有足夠的碼率去使用,而又不超過用戶的帶寬。

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