x264动态改变参数

来源:互联网 发布:微信红包埋雷软件 编辑:程序博客网 时间:2024/05/20 09:22

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_referencebframe_biasscenecut_thresholddeblocking_filterdeblocking_filter_alphac0deblocking_filter_betaframe_packinginterintradirect_mv_predme_rangenoise_reductionsubpel_refinetrellischroma_medct_decimatefast_pskipmixed_referencespsy_rdpsy_trelliscrop_rectme_methodh->param.intertransform_8x8bframe_pyramidslice_max_sizeslice_max_mbsslice_min_mbsslice_countslice_count_maxtffvbv_max_bitratevbv_buffer_sizebitraterconstantrconstant_max 
因此,码率可以动态修改,分辨率不能动态修改

原创粉丝点击