x264动态改变参数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NB_vol_1/article/details/78400494

x264动态改变参数



1、在编码的过程中经常会遇到需要改变编码参数的情况,比如切换分辨率,码率等
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 
因此,码率可以动态修改,分辨率不能动态修改

猜你喜欢

转载自blog.csdn.net/NB_vol_1/article/details/78400494
今日推荐