Some reference information for ffmpeg video compression

Many friends asked me about  VBR in ffmpeg , mainly about which parameters to set and how to set them. I haven't researched ffmpeg's VBR before, so I searched it on the Internet, and returned without success. I will look at the source code of ffmpeg.c later. I initially think that VBR control can be realized through the following parameters or options

    : 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}, "
    { "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" },     qscale set a fixed quantization factor     b set a target bit rate

The only thing I know is:


   qmin qmax The minimum and maximum quantization factors, using this parameter, you can
   set the allowable bit rate error (fixed error) without using the qscale parameter bt
   maxrate minrate Set the maximum and minimum bit rate error (variable error)
   bufsize Set the bit rate control The buffer size

    should pay special attention to the two parameters of maxrate and minrate. They are not the maximum code rate and minimum code rate, but the code rate error range, which is the most confusing. Please add other parts together. , and it is best to give some typical parameter values!

 

 

 

[转]各参数在编码时的作用

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就不用想了,除非自己修改完善

Guess you like

Origin blog.csdn.net/dongtinghong/article/details/77645052