簡單整理一下x264參數(shù)
以本文完成的這個時間節(jié)點來看,x264依然可以說是最流行的視頻編碼。至少在大部分web stream,非編軟件上用的還是很多的,兼容性以及配置上也有較大優(yōu)勢。因此,我至今所有的視頻相關(guān)流程最后都還是在使用AVC進行編碼的。
今天有機會,重新研讀一下x264的文檔和相關(guān)文章,并且分析一下常用的一些編碼參數(shù),以便后續(xù)壓制調(diào)整和參考。
talk is cheap, 我覺得與其事無巨細一個個講,不如直接分析幾個現(xiàn)成的參數(shù)。
首先是我常用的一份參數(shù)
—level 5.1 —preset veryslow —ref 8 —bframes 12 —vbv-bufsize 14000 —vbv-maxrate 14000 —merange 32 —colormatrix bt709 —qpmax 59 —qcomp 0.7 —aq-strength 0.85 —no-dct-decimate
這是很久之前問某大佬要的代碼,最早是用于在B站傳K-ON正片時不被2壓(當(dāng)然后面某站買了正版之后就全下架了)。后來發(fā)現(xiàn)這套參數(shù)壓其他影片包括真人影像也沒有什么太大瑕疵,就一直沿用下來了。
首先是level和preset。兩者都是編碼預(yù)設(shè)。
level建議是留空默認(rèn)的,這樣x264可以自動根據(jù)使用特性和片源來確定適合的level。
當(dāng)然,像屑站二壓后30fps以內(nèi)的profile都是High@L4。雖然屑站現(xiàn)在對非1080+畫質(zhì)或者1080p60 720p60視頻一律二壓,但如果是傳屑站還是建議手動指定一下level 4(4.1)
(按照規(guī)范,1080p60理論上是level4.2)
preset不多做解釋。一般就是slow/slower/veryslow?想選其他選項建議出門左轉(zhuǎn)消極壓制無腦gpu壓。

那么接下來和幀編碼有關(guān)
ref, number of reference frame 參考幀數(shù)量,一幀最多可以參考多少幀。因此越大,相對能節(jié)約體積,但是增加編解碼負擔(dān),降低效率
正常來說日常編碼6或8就可以滿足要求。追求極致壓縮比ref可以選擇13.追求極致編碼速度ref可以選4?ref13比ref4節(jié)省6%~15%體積。
bframes最大允許連續(xù)的B幀數(shù)量,B幀是Bi-directional Frame,雙向預(yù)測幀的意思,屬于關(guān)鍵幀,和P幀(Predictive Frame)相似。區(qū)別在于B幀參考后幀而P幀是參考前幀。
值大,壓縮比高,編碼時間增加。
真人電影3~8,動漫6~12
當(dāng)然,由于B幀體積比較小,所以保證體積角度應(yīng)該在10以上。
所以其實這個也是參數(shù)需要調(diào)整的
merange是控制運動預(yù)測的搜索半徑。值越大壓制越慢。
正常來說只有追求極致才用到30。游戲等20就行。否則默認(rèn)的16也管夠了。
大概我去問的那個大佬有強迫癥吧

前者是緩沖區(qū)大小,后者是最高碼率。兩者配合使用,保證buf>maxrate
一般buf扔在上限上,maxrate比buf相同或者再小一點
當(dāng)然很玄學(xué)的是 之前壓kon一直壓到14000才控制在峰值碼率24M以下。傳屑站供參考
colormatrix?匹配藍光原盤的709即可

然后就是涉及碼率控制的qp值的問題。
qp值就是質(zhì)量量化值,類似CRF的那個數(shù)。
qpmax?為了防止某一幀被壓得爛,可以設(shè)置qpmax為36。一般默認(rèn)就行
qcomp?決定了qp時域變化靈活度,人話就是數(shù)值越低qp變動就越大,不讓高動態(tài)的場景拿到高碼率,就會糊。高畫質(zhì)編碼,qcomp要給高,反之亦然。
默認(rèn)0.6 如果開了mbtree就要高 但不要超過0.8
aq-strength?先講一下aq,Adaptive Quantizers即適應(yīng)性量化數(shù)。主要作用是防止碼率在紋理和平面處被過分降低
這里的strength同樣也是越高質(zhì)量編碼數(shù)值越高
動漫選0.6~1.0左右,真人選0.8~1.2左右。
no-dct-decimate?不糊掉可忽略細節(jié)。顯然要開,不差那2%體積。
當(dāng)然這個也屬于強迫癥參數(shù)

ok,我的這個參數(shù)分析完了,接下來再找?guī)讉€來分析一下。
—preset veryslow —crf 16.5 —threads 16 —deblock -1:-1 —keyint 600 —min-keyint 1 —bframes 8 —ref 13 —qcomp 0.75 —rc-lookahead 70 —aq-strength 0.8 —me tesa —psy-rd 0.6:0.15 —no-fast-pskip —colormatrix bt709 —aq-mode 3 —input-depth 16
這里是vcb教程提供的vcb開mbtree的參數(shù)。mbtree后面再談 還是按順序來說
threads線程數(shù) 這個也不多解釋

deblock?x264的去色塊功能,默認(rèn)0:0就可以,調(diào)高了會糊。或者-1:-1如果已經(jīng)過好去塊濾鏡的話
keyint?關(guān)鍵幀(I幀或者IDR幀)最大允許間隔,默認(rèn)是250.越大視頻壓縮率越高。但是注意!特別是傳屑站,由于有keyframe至少10秒一個的限制,按24幀來算,就要改為240;30幀就是300.
min-keyint?最低關(guān)鍵幀間隔 由于兼容問題(如BD)強制指定1即可。默認(rèn)為fps和keyint/10取小的
bframe和ref分別是b幀最大連續(xù)數(shù)量和參考幀數(shù)量都與體積成正比;而qcomp之前也都說過,略過。
rc-lookahead是mbtree幀控制應(yīng)用的數(shù)量 默認(rèn)40 也是越高質(zhì)量越好速度越慢

me?幀分析模型,veryslow默認(rèn)是umh(多重六邊形),tesa為“經(jīng)過轉(zhuǎn)換的全面搜索”會更慢更好一些
psy-rd?“心理學(xué)優(yōu)化強度” 前面的數(shù)字代表毛邊噪點強度,后面的數(shù)字代表保留細節(jié)。為基于欠碼率寧可看失真也不想看模糊的原則設(shè)置,有利于保留紋理和細節(jié)。前者壓制動漫選擇0.4~1.0,壓制真人選擇0.7~1.3 考慮到文字有毛邊 有說不超過0.5的。越是高質(zhì)量的編碼,可以開的越高。
后者看開不開mbtree,開給0.1。不開直接0。這個高了加碼率。
aq-mode
選擇AQ的算法。
Disable(aq-mode=0,不用aq)
Variance AQ(aq-mode=1)
Auto-Variance AQ(aq-mode=2)。
tMod版x264還加了mode=3/4/5,只不過在megui中需要用自定義命令行來啟用。
一般來說,mode=3最好,最適合動漫,但是碼率稍高;mode=1效果中等,比較安全,不容易出現(xiàn)教爛的幀。mode=2比較省碼率,但是偶爾容易出現(xiàn)爛幀。mode=4是由2優(yōu)化而來,更保險一點。
一般來說,日常壓動漫就選3,壓真人特典選1或者4
默認(rèn)是1
no-fast-pskip?關(guān)閉快速模式 這個關(guān)不關(guān)都行 差不了多少默認(rèn)就行或者干脆就留著
input-depth?輸入色深 這個跟幀服務(wù)器比如vapoursynth配合用的

—preset veryslow —crf 24 —pass 1 —slow-firstpass —stats “E:\disc_1_1.stats” —tune film —deblock -1:-1 —keyint 180 —min-keyint 1 —weightb —ref 13 —vbv-bufsize 24000 —vbv-maxrate 23000 —aq-mode 1 —mbtree —me umh —subme 7 —merange 16 —psy-rd 0.7:0.1 —no-fast-pskip —colormatrix bt709
下面借這個手動1pass 2pass的例子介紹一下人工2pass的方法。
常見策略:1pass 用crf跑 能成品就直接成品;差不多再2pass;差得多換方法。
1pass所需的具體參數(shù):
pass 1?這個是廢話
slow-firstpass?這個是保證雖然開的是1pass但是出來也沒縮水
stats?保存1pass的分析結(jié)果 不然就白pass了
然后deblock,keyint,ref,bufsize,bufsize,aq,mbtree都說過了

subme和merange是me的具體參數(shù);其實是和前面ref/bframes對應(yīng)的。動態(tài)不高ref這一組拉高;動態(tài)高這組拉高。
但是!?。∫驗轭A(yù)設(shè)veryslow都設(shè)好了,其實不動就行。
或者
一般來說,下面三個組合是很好的快中慢三種選擇
—me umh —subme 7 —me_range 16
—me umh —subme 10 —me_range 24
—me tesa —sumbe 10 —me_range 24
好了接著看2pass的
—preset veryslow —bitrate 5800 —pass 2 —stats “E:\disc_1_1.stats” —tune film —deblock -1:-1 —keyint 180 —min-keyint 1 —weightb —ref 13 —vbv-bufsize 24000 —vbv-maxrate 23000 —aq-mode 1 —mbtree —me umh —subme 7 —merange 16 —psy-rd 0.7:0.1 —no-fast-pskip —colormatrix bt709
—bitrate 5800 —pass 2 —stats “E:\disc_1_1.stats”
設(shè)好了碼率,pass數(shù),上次pass的stat就可以了 剩下的完全一致就行
最后看一個,vcb的不開麻痹樹mbtree的
—preset veryslow —crf 17.5 —threads 16 —deblock -1:-1 —keyint 600 —min-keyint 1 —bframes 8 —ref 13 —qcomp 0.6 —no-mbtree —rc-lookahead 70 —aq-strength 0.8 —me tesa —psy-rd 0.6:0.0 —chroma-qp-offset -1 —no-fast-pskip —colormatrix bt709 —aq-mode 3 —input-depth 16
解析(與開mbtree不同的):
—crf 17.5 關(guān)mbtree下,crf應(yīng)該適度增加
—qcomp 0.6 關(guān)mbtee下,一般不需要調(diào)節(jié)qcomp,或者僅僅提高一點點,不要超過0.7
—psy-rd 0.6:0.0 關(guān)mbtree下,編碼器本身會傾向于保留更多噪點級別的細節(jié)。psy-trellis保持0就好了(開mbtree下是0.15)
—no-mbtree 不開啟mbtree
—chroma-qp-offset -1 在psy-trellis=0的時候,手動調(diào)低這個以保證chroma平面畫質(zhì)更好點。
OK,基本上x264到這個份上編碼器層面也就差不多到頭了。x265的參數(shù)雖然很多關(guān)鍵詞一致但是調(diào)起來區(qū)別還是挺大的。等我們改日再研究。
怎么說呢,到3月份了,要搞些專業(yè)相關(guān)的東西了(要編論文畢業(yè)啊)。大概這段時間更幾個視頻處理類的筆記在專欄里,就當(dāng)是對自己的一個督促吧。…… 那么今天的主要研究成果和筆記就是這些。以上。
參考資料
[1]VCB-S.x264參數(shù)設(shè)置[EB/OL].https://vcb-s.nmm-hd.org,2016-02-19.
[2]27015jc.關(guān)于視頻壓縮x264參數(shù)[EB/OL].https://www.bilibili.com/read/cv44064/,2017-10-23.
[3]XSky123.整理下使用VapourSynth進行壓制的相關(guān)流程[EB/OL].https://xsky123.com/archives/37/,2019-11-07.
[4]Chaneru.com.X264 Settings[EB/OL].http://www.chaneru.com/Roku/HLS/X264_Settings.htm.2011-02-07
[5]chenchong_219.x264碼率控制總結(jié)3——碼率控制參數(shù)詳解[EB/OL].https://blog.csdn.net/chenchong_219/article/details/43941655.2015-02-25
[6]神代綺凜.[bilibili] 教你如何壓制B站1080P60幀不二壓視頻[EB/OL].https://moe.best/tutorial/bilibili-1080p60fps.html.2018-04-19