X264中的碼率控制算法

1. 碼率控制的選擇策略:?率失真優(yōu)化模型

RDO: rate-distortion optimization率失真優(yōu)化

限定碼率值Rc,選擇合適的編碼模式簿盅,使得失真D最小。

編碼模式包括量化步長、宏塊模式選擇箩溃、幀內/幀間預測模式選擇等怠噪。

碼率控制的RDO模型的目標是確定每幀或每個宏塊合適的量化步長恐似。

1.1 Lagrangian RDO

H.264標準使用了一種基于Lagrangian優(yōu)化算法的RDO模型實現(xiàn)碼率控制,數(shù)學原理很完美傍念,但實際效果不是很好矫夷,所以實用中很少使用。

在數(shù)學最優(yōu)化問題中憋槐,拉格朗日乘數(shù)法是一種尋找變量受一個或多個條件所限制的多元函數(shù)的極值的方法双藕。這種方法將一個有n?個變量與k?個約束條件的最優(yōu)化問題轉換為一個有n?+?k個變量的方程組的無條件極值問題,進而采用偏微分或全微分法就能很容易求出其極值阳仔。

1.2 X264碼率控制算法

而X264編碼器的碼率控制算法與H.264標準的有很大差別忧陪,主要是根據(jù)經(jīng)驗總結出來的算法。

2. X264的碼率控制的幾個基本原則

(1) 我們希望獲得恒定視覺質量的編碼碼流近范,但是恒定視覺質量并不意味著恒定的PSNR或QP嘶摊。對高復雜度、高運動感的圖像评矩,人眼并不會注意到細節(jié)叶堆,因而可以在某種程度上增大QP而達到相同的視覺質量。

(2) 根據(jù)圖像的重要性來確定不同的QP稚照。由于B幀不用于預測任一其他幀蹂空,故其重要性相對于I、P幀要低果录,因而B幀的量化步長可以較大上枕。

3. X264的RDO模型

X264采用一種半精度幀的SATD(sum of absolute transformed difference)作為模式選擇的依據(jù)。SATD是將殘差做hadamard變換再取絕對值的總和弱恒,它作為一種簡單的時頻變換辨萍,能在一定程度上衡量生成碼流的大小。下圖是一個簡單的2x2的Hadamard變換矩陣:


4. 碼率控制的三種思路-CBR,VBR,ABR

CBR: constants bit rate, 固定碼率編碼器的輸出碼率是一個固定值。

在一個帶寬受限的信道中進行多媒體通訊的時候CBR是非常有用的锈玉,但是CBR不適合進行存儲爪飘,因為CBR會導致沒有足夠的碼率對復雜的內容進行編碼,使復雜內容的質量下降拉背,同時對簡單的內容會浪費一些碼率师崎,這時VBR是較好的選擇。

VBR: Variable Bit Rate椅棺,可變比特率

其原理就是將圖像中的復雜部分用高比特率編碼犁罩,簡單部分用低比特率編碼,通過這種動態(tài)調整編碼速率的方式两疚,進一步得到視頻質量和比特率之間的平衡床估。它的主要優(yōu)點是可以讓每一幀都能大致達到相同的視覺質量,缺點是編碼時無法估計壓縮出來的文件大小诱渤。

ABR: Average Bit Rate丐巫,平均比特率

可以做為VBR和CBR的一種折衷選擇

5. X264中所用的ABR算法

第一,對當前圖像做抽樣濾波勺美,得到分辨率是原來一半的小圖递胧,在小圖上做半像素精度預測,與原圖相減得到殘差Xd赡茸,再對Xd做hadamond變換并求絕對和得到SATD谓着,當前圖像的復雜度就是由當前幀SATD與之前幀SATD值的加權平均構成。

如:設第一幀SATD1=100262坛掠,第二幀SATD2=12812赊锚,第三幀SATD3=12022,則當前幀的復雜度為:

接著由速率控制公式計算相應的qpscale:

其中qcomp為線性量化控制參數(shù)屉栓,0為固定碼率舷蒲,1為固定QP,默認值是0.6友多。

第二牲平,再由之前圖像的編碼信息確定比例因子rate_factor調整qpscale的值,使得編碼速率盡可能接近所要求的平均比特率域滥。若之前已編碼幀的實際比特數(shù)越是大于目標比特數(shù)纵柿,rate_factor越小,縮放后的qpscale就越大启绰,量化步長也越大昂儒,生成的比特流越小,從而達到調整比特率的目的委可。

rate_factor的確定

編碼前會初始化一個長期復雜度累積因子:

complex_sum = 0.01 * 700000f_qcompress * sqrt(mb_count)

當前幀編碼完會使用下述公式累積長期復雜度累積因子:

complex_sum += bits * (0.85 * 2(qp-12)/6) / qp

? 由上式可以看出長期復雜度因子與已編碼的比特數(shù)正相關渊跋。

然后計算截止到當前幀的目標比特數(shù):

wanted_bits_window += bitrate/fps

而rate_factor就是wanted_bits_window與complex_sum的比值:

rate_factor = wanted_bits_window / complex_sum

第三,對qpscale做溢出補償處理,通過補償能夠合理控制文件的大小拾酝,但在一定程度上會降低質量:

? ? ? ? ? ? qpscale = qpscale x overflow

? ? ? ? ? ? overflow? = 1.0 +(total_bits – wanted_bits_window)/abr_buffer

如果實際編碼比特數(shù)total_bits大于目標比特數(shù)燕少,overflow大于1,qpscale被放大蒿囤,從而生成更少的碼流客们;相反如果實際比特數(shù)小于目標比特數(shù),overflow小于1材诽,qpscale被縮小镶摘,量化步長變小,從而生成更多的碼流岳守,調整了比特率。? ?

第四碌冶,由qpscale得到當前幀的量化步長qp:

6. X264中所用的CBR算法

第一步與ABR算法一樣湿痢,算出當前幀的復雜度之后,使用qcomp=0來計算當前幀的qpscale:

在第二步中CBR所用的rate_factor不是由前面幀確定的扑庞,而是由當前vbv_buffer的大小決定的譬重。

Video Buffering Verifier,視頻緩存檢驗器

VBV buffer 的作用是處理各幀編碼后大小不一和輸出CBR 的矛盾罐氨。

CBR規(guī)定encoder的輸出碼率為恒定臀规,但是各幀編碼后的大小不是固定的(I,B,P幀的存在),因此需要在encoder后面加入VBV buffer栅隐。?可以將VBV buffer想象成為一個水池塔嬉,水池的入口連接著encoder的輸出,水池的出口為恒定的碼率輸出租悄。?為了使得輸出恒定谨究,encoder必須保證水池既不上溢也不下溢。下溢會導致無數(shù)據(jù)輸出泣棋,上溢會導致數(shù)據(jù)丟失胶哲。?所以encoder在編碼一幀時會參考當前vbv buffer的充盈情況,推算出一個rate_factor潭辈,用來調整當前幀的量化步長鸯屿,進而確定當前幀應當編碼多少比特才能保證vbv_buffer既不上溢也不下溢。

第三把敢,CBR的溢出補償更加嚴格寄摆,而且在VBV接近0時將會強制限制QP。但在VBV沒用完時并不會強制限制QP修赞,所以CBR的結果多少會比目標碼率低一點冰肴。還要注意的是,如果在所有機制過后,一個幀還是超出了VBV的限制熙尉,那它是不會被重新編碼的联逻。

7. X264中所用的CRF算法

恒定碼率因子碼率控制算法

第一步同ABR算法。

第二步rate_factor恒定為參數(shù)-crf所指定的值检痰。

第三步?jīng)]有溢出補償包归。

8. X264所用的CQP算法

恒定量化參數(shù)碼率控制法

QP只是簡單的和幀類型相關

比如I幀使用QP=26的量化步長,P幀使用QP=28铅歼,B幀使用QP=30公壤。

9. X264所用的自適應量化模型

自適應量化模式Adaptive Quantization Mode。

AQ可以更好把碼率分配到各個宏塊中椎椰。

它的基本原理也是根據(jù)當前宏塊的復雜度SADT厦幅,并與當前幀的平均復雜度做對比,若高于平均慨飘,則分配更多的碼率确憨,即用小于當前幀QP值的量化步長;低于平均值則分配更少的碼率瓤的,即用大于當前幀的QP值的量化步長休弃。

具體到每一個mb,x264又使用了一種復雜的mb-tree的宏塊級的碼率分配算法圈膏。

10.?動態(tài)碼率分配

針對丟包率相對固定的環(huán)境塔猾,動態(tài)碼率分配(DBA)功能可以在視頻通話過程中自動且動態(tài)地調整視頻碼率,以消除或避免丟包稽坤。例如丈甸,在一個384?kbps的視頻通話中(320?kbps用于視頻,64kbps用于音頻)檢測到一個穩(wěn)定在10%的丟包率尿褪,DBA就會降低約10%視頻碼率老虫,由320kbps降到288kbps左右。然后重新采樣信號茫多,觀察是否還存在丟包現(xiàn)象祈匙。如果有必要,DBA可以進一步降低視頻碼率天揖,直到在數(shù)秒內不再出現(xiàn)丟包為止夺欲。???

在降低碼率后,如果DBA測定丟包只是暫時的(持續(xù)時間不到幾秒鐘)今膊,DBA將逐步增加視頻碼率些阅。然而,如果DBA持續(xù)檢測到丟包現(xiàn)象斑唬,它就不再調整視頻碼率市埋,并將通話繼續(xù)進行下去黎泣。這一方法,使得DBA非常適合于由網(wǎng)絡過度使用或因吞吐量問題引起的丟包現(xiàn)象缤谎。

11. 在不同碼控下的測試結果

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末抒倚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坷澡,更是在濱河造成了極大的恐慌托呕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件频敛,死亡現(xiàn)場離奇詭異项郊,居然都是意外死亡,警方通過查閱死者的電腦和手機斟赚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門着降,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拗军,你說我怎么就攤上這事任洞。” “怎么了食绿?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長公罕。 經(jīng)常有香客問我器紧,道長,這世上最難降的妖魔是什么楼眷? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任铲汪,我火速辦了婚禮,結果婚禮上罐柳,老公的妹妹穿的比我還像新娘掌腰。我一直安慰自己,他們只是感情好张吉,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布齿梁。 她就那樣靜靜地躺著,像睡著了一般肮蛹。 火紅的嫁衣襯著肌膚如雪勺择。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天伦忠,我揣著相機與錄音省核,去河邊找鬼。 笑死昆码,一個胖子當著我的面吹牛气忠,可吹牛的內容都是我干的邻储。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼旧噪,長吁一口氣:“原來是場噩夢啊……” “哼吨娜!你這毒婦竟也來了?” 一聲冷哼從身側響起舌菜,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萌壳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后日月,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袱瓮,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年爱咬,在試婚紗的時候發(fā)現(xiàn)自己被綠了尺借。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡精拟,死狀恐怖燎斩,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蜂绎,我是刑警寧澤栅表,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站师枣,受9級特大地震影響怪瓶,放射性物質發(fā)生泄漏。R本人自食惡果不足惜践美,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一洗贰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陨倡,春花似錦敛滋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杂曲,卻和暖如春寂殉,著一層夾襖步出監(jiān)牢的瞬間缠诅,已是汗流浹背财饥。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工闸氮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人货抄。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓述召,卻偏偏與公主長得像朱转,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子积暖,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內容

  • FFmpeg X264編碼參數(shù) 目錄 碼率控制 1 X264的preset和tune 2 編碼延時建議...
    古則閱讀 30,092評論 1 15
  • 相關 x264編碼示例 源碼分析 h264編碼原理復雜藤为,參數(shù)眾多。為了方便使用無論x264還是其他編碼的實現(xiàn)框架夺刑,...
    Don_閱讀 2,206評論 0 1
  • 相關 ffmpeg編碼示例x264編碼示例 概念 h264編碼算法復雜缅疟、參數(shù)眾多,單碼率控制又分為三種模式遍愿。 VB...
    Don_閱讀 10,064評論 0 6
  • [TOC] 音視頻&流媒體 是什么促使我要寫這一篇音視頻入門文章存淫?那是因為和一妹子打賭碼率的概念,結果輸了沼填;對一個...
    AllenWu閱讀 4,835評論 1 24
  • 這是二月的尖尖而上桅咆,接連的幾場大雪把天地刮掃的干干凈凈,不止地上的大樹都各自利利落落坞笙,連湛藍的天空也沒有一絲兒云岩饼,...
    自度散人閱讀 294評論 0 0