天天看點

x264編碼器的參數設定。

轉自:http://blog.csdn.net/table/article/details/8085115

灑家對編碼也是一知半解,很多參數意義也不太清楚,基本都是

實際調整參數後,觀看效果。如果描述錯誤,勿噴。

灑家也沒打算深入研究,灑家隻是想用用該編碼器。

本人使用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(&param, "fast" , "zerolatency" );後就能即時編碼了。

主要是zerolatency該參數。

基本的就這樣了,完整的設定代碼

x264_param_t param;

x264_param_default_preset(&param, "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_num = (int)m_frameRate;         

param.i_fps_den = 1;

param.i_keyint_max = m_frameRate * 2;

// rc

//param.rc.b_mb_tree=0;//找個不為0,将導緻編碼延時幀...在實時編碼時,必須為0

param.rc.f_rf_constant = 25;

param.rc.f_rf_constant_max = 45;

param.rc.i_rc_method = X264_RC_ABR;//參數i_rc_method表示碼率控制,CQP(恒定品質),CRF(恒定碼率),ABR(平均碼率)

//param.rc.f_rate_tolerance=0.1;

param.rc.i_vbv_max_bitrate=(int)((m_bitRate*1.2)/1000) ; // 平均碼率模式下,最大瞬時碼率,預設0(與-B設定相同)

param.rc.i_bitrate = (int)m_bitRate/1000; 

x264_param_apply_profile(&param, "baseline");

param.i_level_idc=30;

param.i_log_level = X264_LOG_NONE;

if(( m_p264Handle = x264_encoder_open(&param)) == NULL) 

看看别人寫的對x264結構體的說明

typedef struct x264_param_t

{

  unsigned int cpu;

  int i_threads;

  int b_deterministic;

  int i_sync_lookahead;

  int i_width;

  int i_height;

  int i_csp;

  int i_level_idc;

  int i_frame_total;

  struct

  {

  int i_sar_height;

  int i_sar_width;

  int i_overscan;

  Int i_vidformat;

  int b_fullrange;

  int i_colorprim;

  int i_transfer;

  int i_colmatrix;

  int i_chroma_loc;

  } vui;

  int i_fps_num;

  int i_fps_den;

  int i_frame_reference;

  int i_keyint_max;

  int i_keyint_min;

  int i_scenecut_threshold;

  int i_bframe;

  int i_bframe_adaptive;

  int i_bframe_bias;

  int b_bframe_pyramid;

  int b_deblocking_filter;

  int i_deblocking_filter_alphac0;

  int i_deblocking_filter_beta;

  int b_cabac;

  int i_cabac_init_idc;

  int b_interlaced;

  int i_cqm_preset;

  char *psz_cqm_file;

  uint8_t cqm_4iy[16];

  uint8_t cqm_4ic[16];

  uint8_t cqm_4py[16];

  uint8_t cqm_4pc[16];

  uint8_t cqm_8iy[64];

  uint8_t cqm_8py[64];

  void (*pf_log)( void *, int i_level, const char *psz, va_list );

  void *p_log_private;

  int i_log_level;

  int b_visualize;

  char *psz_dump_yuv;

  struct

  {

  unsigned int intra;

  unsigned int inter;

  int b_transform_8x8;

  int b_weighted_bipred;

  int i_direct_mv_pred;

  int i_chroma_qp_offset;

  int i_me_method;

  int i_me_range;

  int i_mv_range;

  int i_mv_range_thread;

  int i_subpel_refine;

  int b_chroma_me;

  int b_mixed_references;

  int i_trellis;

  int b_fast_pskip;

  int b_dct_decimate;

  int i_noise_reduction;

  float f_psy_rd;

  float f_psy_trellis;

  int b_psy;

  int i_luma_deadzone[2];

  int b_psnr;

  int b_ssim;

  } analyse;

  struct

  {

  int i_rc_method;

  int i_qp_constant;

  int i_qp_min;

  int i_qp_max;

  int i_qp_step;

  int i_bitrate;

  float f_rf_constant;

  float f_rate_tolerance;

  int i_vbv_max_bitrate;

  int i_vbv_buffer_size;

float f_vbv_buffer_init;

  float f_ip_factor;

  float f_pb_factor;

  int i_aq_mode;

  float f_aq_strength;

  int b_mb_tree;

  int i_lookahead;

  int b_stat_write;

  char *psz_stat_out;

  int b_stat_read;

  char *psz_stat_in;

  float f_qcompress;

  float f_qblur;

  float f_complexity_blur;

  x264_zone_t *zones;

  int i_zones;

  char *psz_zones;

  } rc;

  int b_aud;

  int b_repeat_headers;

  int i_sps_id;

  int i_slice_max_size;

  int i_slice_max_mbs;

  int i_slice_count;

  void (*param_free)( void* );

} x264_param_t;

這個是老版本的,新的x264好像新增了一些參數。