天天看點

關于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表示不作.