關於ffmpeg中的VBR控制的討論

很多朋友問起我關於ffmpeg 中VBR的問題,主要是該設置哪些參數,該 如何設置等問題。以前我也沒有研究過ffmpeg的VBR,所以就在網上查找了一下,無功而返,後面就看ffmpeg.c的源代碼,初步認爲通過下面的參 數或選項便可以實現VBR的控制:

    { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" },
    { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantiser scale (VBR)", "q" },
    { "qmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmin}, "min video quantiser scale (VBR)", "q" },
    { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
    { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
    { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
    { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
    { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
    { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
    { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
    { "qsquish", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qsquish}, "how to keep quantiser between qmin and qmax (0 = clip, 1 = use differentiable function)", "squish" },
    { "qcomp", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qcomp}, "video quantiser scale compression (VBR)", "compression" },
    { "bt", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_tolerance}, "set video bitrate tolerance (in kbit/s)", "tolerance" },
    { "maxrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_max}, "set max video bitrate tolerance (in kbit/s)", "bitrate" },
    { "minrate", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate_min}, "set min video bitrate tolerance (in kbit/s)", "bitrate" },
    { "bufsize", HAS_ARG | OPT_VIDEO, {(void*)opt_video_buffer_size}, "set ratecontrol buffer size (in kByte)", "size" },

這裏面我所知道的僅有:
    b                             設置一個目標碼率
    qscale                     設置固定的量化因子
   qmin qmax               最小和最大量化因子,使用了該參數,就可以不使用qscale參數
   bt                            設置容許的碼率誤差(固定誤差)
   maxrate minrate     設置最大和最小碼率誤差(可變誤差)
   bufsize                    設置碼率控制的緩衝區大小

    這裏面要特別注意的是maxrate和minrate兩個參數,他們並不是最大碼率和最小碼率,而是碼率誤差範圍,最容易迷惑人的,其它的部分還請大家一 起來補充,並且最好能給出一些典型的參數值!

 

 

 

[轉]各參數在編碼時的作用

max_qdiff=3
//視頻中所有楨(包括i/b/P)的最大Q值差距

max_b_frames=2
//兩個非B楨之間的最大B楨數目。

qcompress=0.5
//浮點數值,表示在壓制“容易壓的場景”和“難壓的場景”時,允許Q值之比值的變化範圍。可選值是0.0-1.0。
mb_qmin=1
// MicroBlock的最小Q值
mb_qmax=31
// MicroBlock的最大Q值
pre_me=2
// 提前進行運動場景預測.
rc_eq=tex
//選擇碼率控制的方法。TEX是方法之一。
lmin=1
//最小拉格朗日乘數。拉格朗日乘數法(lagrange multipler)是用來檢定瞬間平均值的一種統計學方法。
lmax=5
//最大拉格朗日乘數
qmin=1
//Q值最小值
qmax=5
//Q值最大值.
qblur=0
//浮點數,表示Q值的比例隨時間消減的程度,取之範圍是0.0-1.0,取0就是不消減。
spatial_cplx_masking=0.3
//浮點數,表示空間複雜性的masking力度。0.0-1.0

strict_std_compliance=-1
//表示嚴格遵照既定標準(MPEG4等等)

me_pre_cmp=2
//運動場景預判功能的力度。數值越大編碼時間越長。

rc_qsquish=1.0
//採用Qmin/Qmax的比值來限定和控制碼率的方法。選1表示局部(即一個clip)採用此方法,選1表示全部採用。

rc_buffer_aggressivity=1.0
//浮點數. 表示開啓解碼器碼流緩衝(decoder bitstream buffer)

bit_rate_tolerance=8000000
//表示有多少bit的視頻流可以偏移出目前的設定.這裏的"設定"是指的cbr或者vbr.

mb_decision=0
//Macroblock的判定模式.有3種,0表示採用用Macroblock比較,2表示採用失真率(rate distortion)參考,1表示選擇0和2中碼率需求最低的一種

b_quant_factor=1.25
//表示i/p與B的Q值比例因子,值越大B楨劣化越嚴重

b_quant_offset=1.25
//表示1/p與B的Q值比例的偏移量,值越大B楨劣化越嚴重.如果大於0,那麼下一個B的Q=前一個P的Q乘以b_quant_factor再加上 offset,如果小於0,則B的Q=負的normal_Q乘以factor加上offset.

i_quant_factor=0.8
//p和i的Q值比例因子,越接近1則P越優化.

i_quant_offset=0.0
//p和i的Q的偏移量

rc_strategy=2
//設定碼率控制策略. 這個策略記不得了;(

b_frame_strategy=0
//B楨生成策略.(我也說不清)

luma_elim_threshold=0
//消除luma(亮度,"紅樓梯")門限

chroma_elim_threshold=0
//從名字上看像是消除色度錯誤的門限,不理解.

dct_algo=0
//離散餘弦變換算法設置,有7種預設置,包括:
0:FF_DCT_AUTO
1:FF_DCT_FASTINT,
2:FF_DCT_INT ,
3:FF_DCT_MMX ,
4:FF_DCT_MLIB,
5:FF_DCT_ALTIVEC
6:FF_DCT_FAAN
有印象好像這些與設算法是針對不同的CPU指令集作優化的,根據作壓制的機器CPU來選擇0-6.

lumi_masking=0.0
dark_masking=0.0
//這兩個表示對過亮或過暗的場景作masking的力度.0表示不作.

 

 

bit_rate 設置爲 64000
bit_rate_tolerance 設置爲 3000

實際輸出碼率最高還是會遠遠超過64000+3000(當輸出關鍵禎的時候),有辦法真正控制最高碼率不?

 

 

ffmpeg雖然大而全,其實bug是非常多的,還有很多功能沒有實現,

不如ffmpeg根本控制不住vbr的碼率,

所以用ffmpeg的vbr就不用想了,除非自己修改完善

 

 

 

有關ffmpeg的進一步實現, 可以參考mplayer源碼包下的mencoder的相關實現

發佈了12 篇原創文章 · 獲贊 14 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章