libx264编码过程中修改码率踩坑记录

问题来源于项目中的一个需求,根据当前网络环境实时调整libx264的码率参数,从而让视频播放更加流畅。
1、设置码率调整算法为ABR。
2、初始化,并提供一个接口供探测网络环境的线程调用。写法大概类似于以下:

  bool reconfigure_bitrate(uint32_t bitrate) {
       param_t->rc.i_bitrate = bitrate;
       x264_encoder_reconfig();
       return true;
  }

3、写完测试发现不起作用,查询资料有部分资料让调用x264_encoder_open()。
4、在提供的接口加上发现流量调整是没问题,但是仔细想想就知道这不是问题的根本解决办法,为什么修改编码参数需要调用open?相当于重新打开编码器?
5、继续查阅源码,发现reconfig接口里面有如下代码:

    /* 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;

如果需要在编码过程中实时修改i_bitrate,需要初始化的时候开启VBV。
6、好了,问题并不是要在reconfig之后重新open,而是在初始化编码器参数的时候开启VBV。

你可能感兴趣的:(音视频编码,C/C++,Linux,h.264,编码器)