我对编码也是一知半解,很多参数意义也不太清楚,基本都是实际调整参数后,观看效果。如果描述错误,勿喷。
我也没打算深入研究,只是想用用该编码器。
本人使用x264主要想调整的参数,
第一,profile,也就是使用baseline还是main,还是high编码。
可以通过该接口设置
x264_param_apply_profile();
第二, 编码复杂度
param.i_level_idc=30;
第三,图像质量控制
param.rc.f_rf_constant = 25;
param.rc.f_rf_constant_max = 45;
rc.f_rf_constant是实际质量,越大图像越花,越小越清晰。
param.rc.f_rf_constant_max ,图像质量的最大值。
第四, 码率控制
一开始我使用恒定码流设置,无论我怎么设置,都无法控制实际码流,后来换成平均码流后,就行了。
param.rc.i_rc_method = X264_RC_ABR;//参数i_rc_method表示码率控制,CQP(恒定质量),CRF(恒定码率),ABR(平均码率)
param.rc.i_vbv_max_bitrate=(int)((m_bitRate*1.2)/1000) ; // 平均码率模式下,最大瞬时码率,默认0(与-B设置相同)
param.rc.i_bitrate = (int)m_bitRate/1000;
x264使用的bitrate需要/1000。
第五,使用实时视频传输时,需要实时发送sps,pps数据
param.b_repeat_headers = 1; // 重复SPS/PPS 放到关键帧前面
该参数设置是让每个I帧都附带sps/pps。
第六. I帧间隔
我是将I帧间隔与帧率挂钩的,以控制I帧始终在指定时间内刷新。
以下是2秒刷新一个I帧
param.i_fps_num = (int)m_frameRate;
param.i_fps_den = 1;
param.i_keyint_max = m_frameRate * 2;
第七,编码延迟
在使用中,开始总是会有编码延迟,导致我本地编码立即解码回放后也存在巨大的视频延迟,
后来发现设置x264_param_default_preset(¶m, "fast" , "zerolatency" );后就能即时编码了。
主要是zerolatency该参数。
基本的就这样了,完整的设置代码
x264_param_t param;
x264_param_default_preset(¶m, "fast" , "zerolatency" );
param.i_width = m_width;
param.i_height = m_height;
param.b_repeat_headers = 1; // 重复SPS/PPS 放到关键帧前面
param.b_cabac = 1;
param.i_threads = 1;
param.i_fps_nu