x264 參數 轉載


圖片組就是視頻內一長串連續的單幀圖像..一般兩個 I 幀之間的部分就是一個圖片組
圖片組包含上述三種幀..一個圖片組一定以 I 幀開始 ..以 I 幀結束..同時結束的這個 I 幀又是下一個圖片組的起始 I 幀......一直這樣排列直到視頻結束..(固然最後視頻的最後一幀99.9%的狀況下都不會是 I 幀)

能夠說視頻就是由若干個圖片組串起來構成的..只要以必定速率播放這些圖片組..就能獲得動態的圖像..

一段視頻一定以 I 幀開始..以B幀或者P幀結束(絕大多數狀況下是的)

以下圖所示(簡單以 I P B表明一串圖像序列)算法

 



兩個 I 幀之間就是一個 GOP..而這段視頻是以 I 幀開頭.. 以B幀結尾~




說到 I 幀和GOP..就不得不提到另外一種特殊的 I 幀..
請觀察下圖..注意紅色標識的 I 幀優化


其實圖中只有一個GOP...那爲何會出現三個 I 幀呢?

這個就得歸功於x264對於GOP長度(越長的GOP其內部包含的幀數越 多)的控制了...由於平均下來一個GOP至少會包含一個 I 幀..而相對來講 I 幀的體積又是巨大的..不利於壓縮率提升..顯然越長的GOP有利於壓縮率提升..因此在x264裏能夠強制定義最短GOP長度和最大GOP長度..即 --min-keyint和--keyint參數..後面會講到..下面講解這種特殊的 I 幀是如何產生的以及其特性


設想下面一種狀況~
視頻的前一幀是mikumikumi~
下一幀變成死宅在屏幕上prprpr~



請問光從畫面上這兩幀有什麼參考性?
顯然沒有...短短兩幀直接跨越了次元障礙還跨越了性別與物種(霧..

這種狀況下之前一幀做爲參考來解碼下一幀簡直是費力不討好!而且極有可能產生解碼錯誤!


因而x264編碼器有這樣一個場景變動檢測的設定..當檢測到下一幀與前一幀差異很大超過設定閥值時..
X264會有下面兩種動做..編碼


1.若是此幀位置距前面最近的一個 I 幀距離大於--min-keyint的值(即最小GOP長度)..則建立一個新的 I 幀做爲參考幀(即建立了一個新的GOP..上一個GOP到此結束)

2.若是此幀位置距前面最近的一個 I 幀距離小於--min-keyint的值(即最小GOP長度)..則建立一個特殊的GOP內部 I 幀 ..俗稱 IDR 幀..(不結束這個GOP..此 I 幀爲這個GOP的內部幀)


須要注意的是:雖然IDR幀也屬於 I 幀..其也是其餘幀的參考幀..但IDR幀有個極其特殊的性質!它禁止IDR幀後面的P幀B幀向它自身以前的幀參考!能夠理解爲它是一個GOP內的「分隔符號」..其餘全部幀都沒法從它以前的幀獲取參考數據!
這樣就避免了上述情景下可能致使的錯誤~spa

既然前面提到碼率是清晰度的標準~
那麼x264編碼器能夠如何作到控制碼率呢?

目前x264編碼器能夠作到下面五種碼率控制模式


ABR [ Average Bitrate ](平均目標碼率模式)
CBR [ Constant Bitrate ](恆定碼率模式)
2pass..3pass..npass(二次..三次..n次編碼模式..嚴格來講也屬於平均目標碼率模式.但其碼率浮動較ABR高出很多.)
CRF [ Constant Ratefactor ] (固定碼率係數模式)
QP [ Constant Quantizer ] (固定量化值模式)


注意了..前面說的是x264能夠作到五種碼率控制模式..
但實際上x264提供的碼率控制方式只有 QP ...Bitrate...CRF三種~!orm

 

QP模式

即以固定量化值(Constant Quantizer)模式來編碼視頻..
須要注意的是這裏的量化參值爲P 幀的量化值..I 幀(包括IDR幀)和 B 幀的量化值又由ipratio和bpratio參數來肯定..不過一般這兩個參數無需手動設置..

簡單點說QP模式就是:相對於壓縮前的原視頻來講..每個 P 幀 ..I 幀 .. B幀都會固定的損失一部分質量..損失斷定是固定的.但因爲I P B幀的插入是不肯定的..因此最終文件的體積是沒法肯定的.


注:設置爲qp0時將產生無損的畫面輸出(輸出文件通常會比源文件大出數倍以上.)..
而且相同視覺質量時..qp模式輸出的視頻文件比crf模式輸出的體積大..
 視頻

Bitrate模式

即爲固定目標碼率模式..(固定目標比特率/位元率模式)


x264會試圖讓最終文件的總體平均碼率與給定的碼率相等!
這會使最終輸出文件的體積是肯定的..適用於精確控制體積.~


但因爲此模式僅編碼一次..沒法對碼率作到合理的分配!
因此畫質上不如相同體積的CRF模式輸出的視頻..


通常推薦2 pass時使用.!或是在時間較緊而又對輸出文件體積有精確要求的狀況下使用!
不然應該使用CRF模式!
 blog

 


CRF模式
即固定Ratefactor模式..【Constant Ratefactor】
也是X264編碼器核心的碼率控制模式

若是說QP是固定量化器,Bitrate是固定文件最終大小..那麼CRF則是則是固定「肉眼質量」..CRF能夠提供跟QP同樣的視覺的質量..可是文件更小..碼率分配更合理..
所以CRF以其一次編碼而碼率分配又最合理的優點脫穎而出!

原理即是CRF模式下經過下降那些「不那麼重要」的幀的質量作到這一切的~..「不那麼重要」意思是過於耗費碼率又難以用肉眼察覺的幀....省下來的碼率會用在其它更能有效提升「視覺質量」的幀裏..

其實CRF就是一個浮動QP模式..其按照特定的標準..根據人眼的需求..給予每幀不一樣的QP量化值 .但玩好CRF模式..和aq..psy..qcomp等參數都脫不開關係..後面會講到~

但須要注意的是CRF模式也沒法預測最終輸出文件的體積!圖片


--bframes
設置x264可以使用的B幀的最大連續數量


仔細食用 I P B 幀說明的UP仍是一看就懂~
前面說過越多的B幀能夠提升壓縮率.由於B幀的體積最小..


因此天然這個參數設定值越大越好~


不過仍是老話..較高的值能提升壓縮率..但會下降編碼速度


默認值:3ip

 

--b-adapt
設定彈性B幀配置決策算法。此設定控制x264如何決定要放置P幀或B幀。



另外一個圖上沒有的參數~不過通常設置下總沒錯的

可選項:
0:停用,老是挑選B幀。就是所有是B幀…(好暴力..)
1:「快速」算法,較快,越大的--bframes值會稍微提升速度。當使用此模式時,基本上建議搭配--bframes 16 使用。
2:「最佳」算法,較慢,越大的--bframes值會越多的下降編碼速度。
(固然若是追求壓縮率..而又不怎麼損失畫質..這個算法配合bframes 16的口味真心不錯)
默認值:1
推薦值:2數學

--keyint
做用是設定最大IDR幀間隔,爲0時則永遠不插入非場景變動的IDR幀


依舊是看了 I P B幀科普的UP們的勝利!


前面也提到了..keyint實際上設定的是GOP長度..越長的GOP通常包含B幀越多..壓縮率也越高~
默認值:250


可設定值:任意正整數(但不要小於視頻幀率)

 

--min-keyint
設定IDR幀之間的最小長度
須要注意的是太小的keyint距離會致使「不正確的」IDR幀位置..所以出現此設置限制最短的IDR幀間隔..


默認值:視頻的幀率
推薦默認值便可..不須要改變

 

--scenecut
場景變動偵測

何爲場景變動?..依舊是認真食用科普的UP們的勝利~

x264爲每一幀計算一個度量值,來估計與前一幀的不一樣程度。若是該值低於scenecut,則算偵測到一個「場景變動」。

一旦出現場景變動.x264就會根據我上面提到的兩個規則插入對應的 I 幀..(請自行回去閱讀 I P B幀科普)

因此來講..越小的scenecut值偵測到的場景變動越少
換言之放置的 I 幀相對越少..

默認值:40

--me


全稱 Motion Estimation(動態估算)
x264在編碼視頻時會在全尺寸上搜索有效的」動態向量「..而後經過記錄這些有效向量的移動來編碼視頻..


可用選項有五個:


dia(diamond):最簡單的搜尋方法,起始於最佳預測器(predictor),檢查上、左、下、右方一個像素的動態向量,挑選其中最好的一個,並重復此過程直到它再也不找到任何更好的動態向量爲止。

hex(hexagon):由相似策略組成,除了它使用周圍6點範圍爲2的搜尋,所以叫作六邊形。它比dia更有效率且幾乎沒有變慢,所以做爲通常用途的編碼是個不錯的選擇。


umh(uneven multi-hex):比hex更慢,但搜尋複雜的多六邊形圖樣以免遺漏難以找到的動態向量。不像hex和dia,merange參數直接控制umh的搜尋半徑,容許增長或減小廣域搜尋的大小。


esa(exhaustive): 一種在merange內整個動態搜尋空間的高度最佳化智慧搜尋。雖然速度較快,但數學上至關於搜尋該區域每一個單一動態向量的暴力(bruteforce) 方法。不過,它仍然比UMH還要慢,並且沒有帶來很大的好處,因此對於平常的編碼不是特別有用。


tesa(transformed exhaustive):一種嘗試接近在每一個動態向量執行Hadamard轉換法比較的效果之算法,就像exhaustive,但效果好一點而速度慢一點

默認值:hex
推薦值:umh
從上到下效果遞增但編碼速度遞減..越靠下的算法越能找到更多的有效動態向量..但速率也越慢..通常來講追求速度質量平衡就用umh..追求壓縮率就用tesa...(由於esa速度幾乎和tesa差很少..可是效果不如tesa..)

--merange
控制動態向量搜索的最大範圍
有了動態向量估算..那麼總得指定一個估算的搜索範圍吧?..
默認值:16
可設定任意正整數
推薦值:20-28
須要注意的是...此設定範圍和--me的設置有關
當--me設定爲hex或更差的算法時..--merange最大值爲16
當--me設定爲umh或更好的算法時..--merange值可超過16


但一般來講720p設置爲24-28都仍是不錯的..固然做死設置32沒問題..不過編碼速度會降低很多..32以上值不推薦..

--subme
全稱(Subpixel Refinement)
用來設定子像素(subpixel)估算複雜度。值越高越好!
可選項 1 - 11


1 - Qpel SAD:用全像素塊進行動態搜索,對每一個塊再用快速模式進行四分之一像素塊精確搜索
2 - Qpel SATD:用半像素塊進行動態搜索,對每一個塊再用快速模式進行四分之一像素塊精確搜索
3 - Hpel on MB then QP:用半像素塊進行動態搜索,對每一個塊再用質量模式進行四分之一像素塊精確搜索
4 - Always QPel:用快速模式進行四分之一像素塊精確搜索
5 - Qpel Bidir ME:用質量模式進行四分之一像素塊精確搜索
6 - RD on I/P frames:進行I、P幀像素塊的速率失真最優化(rdo)
7 - RD on all frames:進行所有幀像素塊的速率失真最優化

8 - RD refinement on I/P frames:進行I、P幀運動矢量及塊內部的速率失真最優化
9 - RD refinement on all frames:進行所有幀運動矢量及塊內部的速率失真最優化
10 - QP-RD:對每一個塊進行四分之一像素塊精確搜索及塊內部的速率失真最優化 (須要Trellis=2,AQ-Mode>0)
11 - Mod編譯版特有的福利..最優化的算法..速度也最慢!(須要Trellis=2,AQ-Mode>0)
默認值:7
推薦值:9 或 10
不在乎時間就11


由於9到10在到11...壓縮率的提高真的很出色!
我本人用這個實測過..9 到10的狀況下..一樣畫面的碼率能至少下降100-200kbps!
因此說只要我的能忍受..越高越好!

--trellis
trellis量化設置
可選項:
0:停用。
1:只在一個宏區塊的最終編碼上啓用。
2:在全部模式決策上啓用。
默認值:1
推薦值:2


須要注意的是這個設置能在相同碼率下提供更好的畫質.因此儘可能開推薦值吧~.
但會略微下降編碼效率..

--aq-mode
即自適應量化器模式


做用是在一幀中不一樣區塊間從新分配量化值..能提升暗部細節!並使幀內的碼率分配更加合理!
此設定會變動自適應量化器會從新分配碼率到什麼範圍裏~


可選項:
0:徹底不使用aq
1:容許AQ從新分配碼率到整個視頻和幀內。
2:自動變化(Auto-variance)AQ,會嘗試對每幀調整強度。
3:綜合aq2模式的升級版本..可使碼率分配更加合理!
默認值:1
推薦值:3

--aq-strength
顧名思義自適應量化強度..
設定AQ偏向低細節(flat)的宏區塊的強度..
較低的值能夠保留更多高頻信息..但flat區域會有些慘..
通常來講畫面動態較高的話就用0.6-0.8..以避免在flat區域浪費太多碼率致使動態畫面糊掉..
畫面總體靜態惟美的那種就用1.0左右的值便可..防止暗部出現因欠碼產生的色帶等問題
默認值:1.0
可設定爲任意正浮點數

 

psy
心理視覺優化算法(須要subme≥6...trellis≥1)
默認開啓~強烈建議開啓
維持默認不要動就是了
參數之 --psy-rd 心理視覺優化算法的強度 格式爲x :x 第一個數爲psy-rdo的強度 第二個數爲psy-trellis的強度 --direct 設定"direct"動態向量(motion vectors)的預測模式.. 默認值:spatial 推薦值:auto auto容許x264自行切換預測模式..而對速度的影響微乎其微.但能略微提升壓縮率~.因此推薦直接寫上 --direct auto  

相關文章
相關標籤/搜索