版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NB_vol_1/article/details/78400494
x264动态改变参数
2、有的参数可以在运动时动态修改;有的参数则必须在open之前设定,如果需要修改就必须要先关闭编码器然后重新打开
3、下面我们来看一下哪些参数可以动态修改,动态修改编码参数的入口函数是x264_encoder_reconfig,它实际上封装了对x264_encoder_try_reconfig的调用,定义如下:
int x264_encoder_reconfig( x264_t *h, x264_param_t *param )
{
h = h->thread[h->thread[0]->i_thread_phase];
x264_param_t param_save = h->reconfig_h->param;
h->reconfig_h->param = h->param;
int rc_reconfig;
int ret = x264_encoder_try_reconfig( h->reconfig_h, param, &rc_reconfig );
if( !ret )
h->reconfig = 1;
else
h->reconfig_h->param = param_save;
return ret;
}
static int x264_encoder_try_reconfig( x264_t *h, x264_param_t *param, int *rc_reconfig )
{
*rc_reconfig = 0;
x264_set_aspect_ratio( h, param, 0 );
#define COPY(var) h->param.var = param->var
COPY( i_frame_reference ); // but never uses more refs than initially specified
COPY( i_bframe_bias );
if( h->param.i_scenecut_threshold )
COPY( i_scenecut_threshold ); // can't turn it on or off, only vary the threshold
COPY( b_deblocking_filter );
COPY( i_deblocking_filter_alphac0 );
COPY( i_deblocking_filter_beta );
COPY( i_frame_packing );
COPY( analyse.inter );
COPY( analyse.intra );
COPY( analyse.i_direct_mv_pred );
/* Scratch buffer prevents me_range from being increased for esa/tesa */
if( h->param.analyse.i_me_method < X264_ME_ESA || param->analyse.i_me_range < h->param.analyse.i_me_range )
COPY( analyse.i_me_range );
COPY( analyse.i_noise_reduction );
/* We can't switch out of subme=0 during encoding. */
if( h->param.analyse.i_subpel_refine )
COPY( analyse.i_subpel_refine );
COPY( analyse.i_trellis );
COPY( analyse.b_chroma_me );
COPY( analyse.b_dct_decimate );
COPY( analyse.b_fast_pskip );
COPY( analyse.b_mixed_references );
COPY( analyse.f_psy_rd );
COPY( analyse.f_psy_trellis );
COPY( crop_rect );
// can only twiddle these if they were enabled to begin with:
if( h->param.analyse.i_me_method >= X264_ME_ESA || param->analyse.i_me_method < X264_ME_ESA )
COPY( analyse.i_me_method );
if( h->param.analyse.i_me_method >= X264_ME_ESA && !h->frames.b_have_sub8x8_esa )
h->param.analyse.inter &= ~X264_ANALYSE_PSUB8x8;
if( h->pps->b_transform_8x8_mode )
COPY( analyse.b_transform_8x8 );
if( h->frames.i_max_ref1 > 1 )
COPY( i_bframe_pyramid );
COPY( i_slice_max_size );
COPY( i_slice_max_mbs );
COPY( i_slice_min_mbs );
COPY( i_slice_count );
COPY( i_slice_count_max );
COPY( b_tff );
/* VBV can't be turned on if it wasn't on to begin with */
if( h->param.rc.i_vbv_max_bitrate > 0 && h->param.rc.i_vbv_buffer_size > 0 &&
param->rc.i_vbv_max_bitrate > 0 && param->rc.i_vbv_buffer_size > 0 )
{
*rc_reconfig |= h->param.rc.i_vbv_max_bitrate != param->rc.i_vbv_max_bitrate;
*rc_reconfig |= h->param.rc.i_vbv_buffer_size != param->rc.i_vbv_buffer_size;
*rc_reconfig |= h->param.rc.i_bitrate != param->rc.i_bitrate;
COPY( rc.i_vbv_max_bitrate );
COPY( rc.i_vbv_buffer_size );
COPY( rc.i_bitrate );
}
*rc_reconfig |= h->param.rc.f_rf_constant != param->rc.f_rf_constant;
*rc_reconfig |= h->param.rc.f_rf_constant_max != param->rc.f_rf_constant_max;
COPY( rc.f_rf_constant );
COPY( rc.f_rf_constant_max );
#undef COPY
return x264_validate_parameters( h, 0 );
}
从代码中可以看到,并不是所有的参数都能动态修改,只有下面的参数能够动态修改:
frame_reference
bframe_bias
scenecut_threshold
deblocking_filter
deblocking_filter_alphac0
deblocking_filter_beta
frame_packing
inter
intra
direct_mv_pred
me_range
noise_reduction
subpel_refine
trellis
chroma_me
dct_decimate
fast_pskip
mixed_references
psy_rd
psy_trellis
crop_rect
me_method
h->param.inter
transform_8x8
bframe_pyramid
slice_max_size
slice_max_mbs
slice_min_mbs
slice_count
slice_count_max
tff
vbv_max_bitrate
vbv_buffer_size
bitrate
rconstant
rconstant_max
因此,码率可以动态修改,分辨率不能动态修改