天天看點

視訊編碼中CBR和VBR的差別,CRF和CQP的差別

在視訊編碼中,有一個子產品是碼率控制,即通過選擇一系列編碼參數,使得視訊編碼後的比特率滿足所需要的速率限制,并且使編碼失真竟可能小。該子產品嚴格上不屬于視訊編碼标準,屬于率失真優化有兩範疇。碼率控制分為兩個步驟,一個是碼率配置設定,二是确定量化參數;

    在實際應用中,存在好幾種碼率控制方法,分别是CBR,VBR,ABR和CVBR,下面對着四個技術進行展開:

CBR:constant bitrate

     顧名思義,以恒定比特率方式進行編碼,有運動發生時,由于碼率恒定,隻能通過增大QP來減少碼字大小,圖像品質變差,當場景靜止時,圖像品質又變好,是以圖像品質不穩定。這種算法優先考慮碼率(帶寬)。适合在流式播放中應用。CBR編碼的缺點在于編碼内容的品質不穩定,容易産生馬賽克。因為對于某些較複雜的圖像比較難壓縮,是以CBR流的某些部分品質就比其他部分差。

   具體的,一段視訊一共有10分鐘,我們設定的碼流為1M,那麼這個視訊中每一秒的畫面都是1M碼流。

VBR:variable bitrate

    顧名思義,即以可變的比特方式進行編碼,比特配置設定根據圖像内容的複雜度進行。如果圖像細節較豐富或者含有大量的運動,則給其配置設定大一點的碼流,若圖像比較平坦,就給其配置設定較少的碼流,   這樣既保證了品質,又兼顧帶寬限制。這種算法适合圖像内容變化幅度較大的情況;

    适合的應用場景是媒體存儲,不适合網絡傳輸;

ABR:average bitrate

      平均比特率,是在CBR和VBR兩者之間的一種權衡,即設定一段時間的平均碼率,在此時間内,對簡單,靜态的圖像配置設定低于平均碼率的碼率,對于複雜的,大量運動的圖像配置設定高于平均碼率的碼流;

   适合網絡傳輸;

CVBR:Constrained VariableBit Rate

     是VBR的一種改進方法,對應的Maximum bitRate恒定或者Average BitRate恒定。兼顧了CBR和VBR的優點:在圖像内容靜止時,節省帶寬,有運動發生時,利用前期節省的帶寬來盡可能的提高圖像品質,達到同時兼顧帶寬和圖像品質的目的。這種方法通常會讓使用者輸入最大碼率和最小碼率,靜止時,碼率穩定在最小碼率,運動時,碼率大于最小碼率,但是又不超過最大碼率。比較理想的模型如下:

      碼率控制:

      對幀間圖像進行碼率控制:

       可以根據被參考的重要性來配置設定碼率,如過某個幀經常被參考,則給他配置設定多點的碼率,如果沒有被參考,則可以配置設定少點的碼率;

 對幀内圖像怎麼進行碼率控制;

      細節多的配置設定少點的碼率,比如石頭,樹枝,運動物體配置設定少點碼率,因為被參考的可能性不大;

如果一個塊被選中是幀内模式,怎麼改可以讓它選擇幀間模式;

     改lamda?碼率控制?不知道;

    在做足球直播時,固定碼率好還是固定QP好?固定QP好,可以節省碼率;

如果固定碼率,則在畫面靜止時會浪費帶寬,而固定QP時,畫面靜止時也不會浪費太多的比特;

轉發自javascript:void(0)

本文翻譯自 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的編碼,來擷取一個最佳的編碼方式。對于其他的使用場景,請使用其他的碼率控制模式。

視訊編碼中CBR和VBR的差別,CRF和CQP的差別

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

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模式

視訊編碼中CBR和VBR的差別,CRF和CQP的差別

我們看到,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編碼來決定對于某一特定源,應該用某種碼率去編碼。確定對于複雜場景有足夠的碼率去使用,而又不超過使用者的帶寬。