x264動態改變參數

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 
因此,碼率可以動態修改,分辨率不能動態修改
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章