1. 程式人生 > >X264位元速率控制總結1——ABR,CQP,CRF

X264位元速率控制總結1——ABR,CQP,CRF

1.  X264顯式支援的一趟位元速率控制方法有:ABR, CQP, CRF. 預設方法是CRF。這三種方式的優先順序是ABR > CQP > CRF.
  1. if ( bitrate )                rc_method = ABR;  
  2. elseif ( qp || qp_constant ) rc_method = CQP;  
  3. else                          rc_method = CRF;      
    bitrate和QP都沒有預設值,一旦設定他們就表示要按照相應的位元速率控制方法進行編碼,CRF有預設值23,沒有任何關於編碼控制的設定時就按照CRF預設值23來編碼。        一般的使用建議:    CQP – 一般不推薦使用,在一些演算法驗證工作中會使用這種模式     CRF – 適合在關注一遍編碼質量而輸出檔案大小或位元速率不是太緊要的場景下使用,一般網路壓片使用CRF。     1 pass ABR – 適用於流媒體或者目標位元速率受限的實時應用場景。    2 pass VBR – 適用於有目標位元速率限制而又有時間可以進行二次編碼的非實時應用。
2.
CQP,恆定QP. 無預設值         最簡單的位元速率控制方式,每幀影象都按照一個特定的QP來編碼,每幀編碼後的資料量有多大是未知的。
        引數qp_constant設定的是P幀的QP。I,B幀的QP根據f_ip_factor, f_pb_factor,計算得到。
  1. rc->ip_offset = 6.0 * log2f( h->param.rc.f_ip_factor );  
  2. rc->pb_offset = 6.0 * log2f( h->param.rc.f_pb_factor );  
  3. rc->qp_constant[SLICE_TYPE_P] = h->param.rc.i_qp_constant;  
  4. rc->qp_constant[SLICE_TYPE_I] = x264_clip3( h->param.rc.i_qp_constant - rc->ip_offset + 0.5, 0, QP_MAX );  
  5. rc->qp_constant[SLICE_TYPE_B] = x264_clip3( h->param.rc.i_qp_constant + rc->pb_offset + 0.5, 0, QP_MAX );  
        連續多個B幀時,QP會漸增。        x264 YUV420格式 8位元取樣的QP範圍是[0, 51]。QP值越小,編碼視覺質量越好。QP=0為無失真編碼。
        在研究編碼演算法的時候,一般會選用CQP方法,設定QP為24,28,32,36,40等(一般選4個QP值),編碼得到RD曲線,然後比較演算法優劣。 
        相同視覺質量時,CQP編碼輸出的檔案會比CRF模式更大。一般而言CRF都能代替CQP方法,不過CQP因為完全不需要預測所以它會執行得更快一些。 
        幀的重要級別為:IDR幀 > I幀 > P幀 > 做參考的B幀 > 不做參考的B幀。QP可以依次增大。  
       QPmin,預設值: 0。定義X264可以使用的最小量化值。量化值越小,輸出視訊質量就越好。
               當QP小於某一個值後,編碼輸出的巨集塊質量與原始塊極為相近,這時沒必要繼續降低QP。
               如果開啟了自適應量化器(預設開啟),不建議提高QPmin的值,因為這會降低平滑背景區域的視覺質量。
       QPmax,預設值: 51。定義X264可以使用的最大量化值。預設值51是H.264規格中可供使用的最大量化值。
               如果想要控制X264輸出的最低品質,可以將此值設定的小一些。
               QPmin和QPmax在CRF,ABR方法下是有效的,過低的設定QPmax,可能造成ABR位元速率控制失敗。不建議調整這個引數。
       QPstep,預設值: 4。設定兩幀間量化值的最大變化幅度。 
       幀間QP變化,幀內巨集塊QP不變,輸出位元速率未知,各幀輸出視覺質量有變化(高QP低位元速率的情況下會更明顯)。
3. CRF,恆定Rate Factor (位元速率係數)預設值23
       CQP是把某個量化值作為目標,bitrate是把某個輸出檔案大小作為目標,而CRF則是把某個輸出“視覺質量”作為目標。
       CRF可以提供跟QP一樣的視覺質量,但是檔案更小,CRF是通過降低那些“less important”幀的質量來達到此目的的。
       “less important”的意思是那些過於耗費位元速率又難以用肉眼察覺的幀,比如複雜或者高速執行的場景。省下來的位元速率會分配給其它更有效的幀。
       在X264編碼器內部CRF和bitrate採用了相同的調整策略,只是它不遵循一個特定的輸出位元速率。
       它也是通過改變不同重要級別幀(I,P,B型別),以及幀內不同巨集塊型別(高速運動,複雜紋理,平坦區域)的QP值,以此來調整輸出視覺質量。
       和QP的範圍一樣RF的範圍也是[0, 51]。其中0為無損模式,23為預設,51質量最差。和QP一樣的趨勢。RF值加6,輸出位元速率大概減少一半;減6,輸出位元速率翻倍。
       從主觀上講,18~28是一個合理的範圍,18往往被認為從視覺上看是近似無損的。
       幀間QP變化,幀內巨集塊QP變化,輸出位元速率未知,各幀輸出視覺質量基本恆定。
4. ABR, 恆定平均目標位元速率。想要選擇這種位元速率控制方法,必須先設定bitrate。
       X264中bitrate的單位是Kbps(K bit per second). --bitrate 128指的是設定目標位元速率為128Kbps, 這樣一秒鐘的資料量為 128/8位元 = 16K位元組。
       如果輸入為[email protected],相當於128Kbit/(352*288*15) = 0.086位元每畫素。編碼後每個畫素平均分配不到0.1個位元。
       與ABR相應的技術有CBR,VBR。這些位元速率控制技術首先都是在音訊編碼中採用,是解決音訊編碼採用什麼樣的位元率最優的問題。

CBR編碼碼位元率基本保持恆定在目標位元率,有利於流式播放。 CBR的缺點在於複雜場景位元速率不夠用,簡單場景位元速率浪費,因此編碼內容的視覺質量不穩定。通常在較低位元率下,這種質量的變化會更加明顯。

VBR編碼為簡單場景分配較大的QP,為複雜的場景分配較小的QP,得到基本穩定的輸出視覺質量。 相對於CBR,在相同檔案大小的條件下,VBR的輸出結果要比CBR好的多,這有利於媒體下載和本地儲存。 VBR的缺點在於輸出碼流大小不可控。同時對於複雜度恆定的內容(例如新聞播音)沒什麼優勢。

ABR編碼為簡單場景分配較少的位元,從而留出足量的位元用於生成高質量的複雜部分。使得有限的位元數能夠在不同的場景間合理分配,這類似於VBR。 同時ABR分配位元速率,使得在一定時間內,平均位元速率趨近於目標位元速率,這樣可以控制輸出檔案大小,這點類似於CBR。 因此可以認為ABR是CBR和VBR的一種折中優化方案。

       分析視訊編碼位元速率控制可以通過三個因素:
       1. 視覺質量穩定性,利於視覺主觀質量;
       2. 即時輸出位元速率,相當於每幀編碼輸出位元數;
       3. 輸出視訊檔案大小可控,利於傳輸,儲存。
       比較這三種位元速率控制方式如下:
       #        視覺質量穩定性         即時輸出位元速率        輸出檔案大小
       CBR          不穩定               恆定               可控
       VBR           穩定                變化              不可控
       ABR         基本穩定               變化               可控 (即時位元速率變化,但一段時期內平均位元速率趨近目標位元速率)

       在當前X264版本中(version 142),選用ABR需要注意兩個設定,1.fps;2.輸出幀pts計算。  
       1. fps。ABR會根據幀率來估算每幀的平均資料量,bitrate/fps為平均一幀資料量。
          當輸入視訊源為YUV資料,需要顯式的指定正確的幀率--fps,否則X264會用預設的25fps來計算,有可能控制不到設定的目標位元速率。
       2. pts計算。ABR演算法中用到不同幀的pts作為幀間距離,如果沒有設定輸出幀的pts值,X264會報“non-strictly-monotonic PTS”警告。
          編碼出來的視訊檔案位元速率很小,根本達不到bitrate的設定,同時視訊質量很差,幾乎都為馬賽克。兩種方法解決這個問題:
          a. 設定param.b_vfr_input = 0,這時用fps而不是timebase,timestamps來計算幀間距離
          b. 在解碼後主動更新pts, pic_out.i_pts++;
         這兩種方式都可以避免ABR位元速率控制失效的問題。

相關推薦

X264位元速率控制總結1——ABR,CQP,CRF

1.  X264顯式支援的一趟位元速率控制方法有:ABR, CQP, CRF. 預設方法是CRF。這三種方式的優先順序是ABR > CQP > CRF. if ( bitrate )                rc_method = ABR;  elseif

x264位元速率控制

x264中有三種位元速率控制方式:ABR(Average Bit Rate)、CQP、CRF(Control Rate Factor) ABR模式: ----平均位元速率模式 ----儘量保證編碼的視訊位元速率控制在目標位元速率上下,但是無法保證一定會 ----設定位元速率控制

H.264---位元速率控制策略

轉自:https://blog.csdn.net/yuanray/article/details/54090014 CBR(Constant Bit Rate)是以恆定位元率方式進行編碼,有Motion發生時,由於位元速率恆定,只能通過增大QP來減少碼字大小,影象質量變差,當場景靜止時,影象質量又變好,因此

H264三種位元速率控制方法(CBR, VBR, CVBR)

CBR(Constant Bit Rate)是以恆定位元率方式進行編碼,有Motion發生時,由於位元速率恆定,只能通過增大QP來減少碼字大小,影象質量變差,當場景靜止時,影象質量又變好,因此影象質量不穩定。這種演算法優先考慮位元速率(頻寬)。 這個演算法也算是位元速率控制

編碼位元速率控制方法

What is “rate control”? It’s what a video encoder does when it decides how many bits to spend for a given frame. The goal of (lossy) video encoding is to

HEVC位元速率控制程式碼追蹤(一)(HEVC code tracing-Rate control)

接下來的一段時間將對位元速率控制程式碼追蹤這一塊的學習心得和領悟做個簡要的記錄,在將來的某一天,這些博文將讓我清晰地看到自己的成長。 位元速率控制的關鍵兩個步驟:(1)位元速率分配(2)目標位元速率的實現 所以在看程式碼的時候也儘量將步驟與程式碼對應起來,分塊閱讀,整合思考

H.265/HEVC位元速率控制總體框架與程式碼解讀(上)

HEVC的位元速率控制(Rate Control)部分是我研究生期間的研究重點,近期在導師的敦促下開始論文寫作,需要總結整個位元速率控制的框架以及自身對位元速率控制的演算法改進部分,藉此機會把位元速率控制的理論部分與實際程式碼部分進行一個整理和歸納,可作為各位博友的參考

HEVC幀間位元速率控制

1. 首先呼叫initPicPara以及initLCUPara兩個函式對影象級和CTU級的alpha和beta進行初始化。initPicPara:framelevel=0 則 alpha=6.7542,

HEVC位元速率控制演算法研究與HM相應程式碼分析(三)——演算法及程式碼分析

在前兩篇文章中,首先介紹了HEVC標準和編碼流程,然後介紹了在HEVC中採用的全新的R-λ模型,本文將基於前面的內容和相應程式碼對位元速率控制演算法進行詳細的分析。 下面基於JCTVC-K0103提案詳細介紹一下HEVC中基於R-λ模型的位元速率控制方法。同時基於HM-10

LoRa關鍵引數 1、擴頻因子(SF) 2、編位元速率(CR) 3、訊號頻寬(BW) 4、LoRa訊號頻寬BW、符號速率Rs和資料速率DR的關係

 LoRa學習:LoRa關鍵引數(擴頻因子,編位元速率,頻寬)的設定及解釋 1、擴頻因子(SF) 2、編位元速率(CR) 3、訊號頻寬(BW) 4、LoRa訊號頻寬BW、符號速率Rs和資料速率DR的關係 5、 LoRa訊號頻寬、擴頻

FFmpeg入門--碼流 / 位元速率 / 位元率 / 幀速率 / 解析度 【1

I、P、B 幀 I 幀(Intracoded frames):I 幀影象採用幀內編碼方式,即只利用了單幀影象內的空間相關性,而沒有利用時間相關性。I 幀使用幀內壓縮,不使用運動補償,由於I 幀不依賴其它幀,所以是隨機存取的入點,同時是解碼的基準幀。I 幀主要用於接收機的初始化和通

數字電視中相關概念1位元速率、符號率、頻寬、寬頻

      數字通訊的理論是:8MHz是載波頻寬,因為調製是雙邊帶的,其基帶頻寬為4MHz。Nyquist理論說,每Hz的頻寬可以傳 2symbol/s的資料,這個說法是說傳送濾波器可以做到理想頻率響應。那麼在正常情況下做不到的,所以最常用的設計方法是升餘弦響應,這種設計有個

PL/SQL知識總結(1):PL/SQL塊結構和流程控制語句

前一段時間系統學習了Oracle PL/SQL的有關知識,內容有點多,所以覺得自己要總結一下,順便回顧,大家共同學習。 PL/SQL的概念 PL/SQL是 Procedure Language & Structured Query Languag

UI--普通控制元件總結1--控制元件使用

2.標籤UILabel和按鈕UIButton UILabel標籤控制元件常用於標識一些資訊,UIButton常用於完成一些動作。 回到頂部 2_1.標籤UILabel UILabel常見的屬性 1.shadowColor屬性:設定陰影顏色 。 2.shadowOffset屬性:設定

項目期復習總結1:背景圖合並,hack,瀏覽器內核前綴,偽類after before

標準 after 不同 fixed cli 條件 人員 tle ble 文件夾: 1、背景圖合並和CSS Spirit 2、PS基本快捷鍵 3、hack技術基本書寫,為什麽不用? 4、內核前綴 5、偽類afterbefore 1、背景

Oracle學習總結1

prior 截斷 解析 sim 格式轉化 reside 真的 length 表示 一、 cmd下登錄oracle服務器 sqlplus scott/tiger@//192.168.241.128:1521/orc 二、基本操作   1、解決sqlplus不支

Ubuntu kylin常用總結1

mail ubuntu art 查看 ger 終端命令 logs 錯誤 linu 1、常用的linux終端命令快捷鍵 Ctrl+U :剪切光標前的內容Ctrl+K :剪切光標至行末內容Ctrl+Y :粘貼Ctrl+E :移動光標至行末Ctrl+A :移

HBase學習總結(1):HBase的下載與安裝

oot 停止 微信公眾號 profile jdk1 variable jdk oop lib (HBase是一種數據庫:Hadoop數據庫,它是一種NoSQL存儲系統,專門設計用來高速隨機讀寫大規模數據。本文介紹HBase的下載與安裝的整個過程。) 一

PHP的知識點總結1

指令 cal 環境 w3c nan 命令 mysq web 速度 PHP 基礎知識總結 2015-06-03 分類: 編程技術 PHP 代表 PHP: Hypertext Preprocessor PHP 文件可包含文本、HTML、JavaScript代碼和 PHP

C# 《五》流程控制1

generic ram div 執行 進行 運行 align strong c# 1、分支語句之 if 語句 1、流程控制語句是程序的核心部分,對任何一門編程語言來說都至關重要,是控制程序執行流向的基本語句。如果一門語言缺少了流程控制,就會缺少對程序流向的控制,就不能稱之為