(轉)x264的一些參數設置對編碼效率的影響

轉自:http://www.cnblogs.com/wainiwann/p/5647521.html

i_luma_deadzone[0]和i_luma_deadzone[1]分別對應inter和intra,html

取值範圍1~32,測試能夠得知,這連個參數的調整能夠對數據量有很大影響,值越大數據量相應越少,佔用帶寬越低;算法

 

碼率控制模式有ABR(平均碼率)、CQP(恆定質量)、CRF(恆定碼率)
ABR模式下調整i_bitrate,
CQP下調整i_qp_constant調整QP值,範圍0~51,值越大圖像越模糊,默認23
太細緻了人眼也分辨不出來,爲了增長編碼速度下降數據量仍是設大些好,
CRF下調整f_rf_constant和f_rf_constant_max影響編碼速度和圖像質量(數據量);
 
f_rf_constant 設置 33 數據速率 972kbps  圖像質量還行,設置20 數據速率 2501kbps ,設置30 數據速率1520kbps
 
http://www.2cto.com/kf/201311/254711.html
=============================================================================
http://blog.csdn.net/table/article/details/8085115

本人使用x264主要想調整的參數,數據結構

第一,profile,也就是使用baseline仍是main,仍是high編碼。app

能夠經過該接口設置ide

x264_param_apply_profile();oop

第二, 編碼複雜度post

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
{
  /* CPU 標誌位 */
  unsigned int cpu;
  int i_threads; /* 並行編碼多幀 */
  int b_deterministic; /*是否容許非肯定性時線程優化*/
  int i_sync_lookahead; /* 線程超前緩衝 */

  /* 視頻屬性 */
  int i_width; /* 寬度*/
  int i_height; /* 高度*/
  int i_csp; /* 編碼比特流的CSP,僅支持i420,色彩空間設置 */
  int i_level_idc; /* level值的設置*/
  int i_frame_total; /* 編碼幀的總數, 默認 0 */
/*Vui參數集視頻可用性信息視頻標準化選項 */
  struct
  {
  /* they will be reduced to be 0 < x <= 65535 and prime */
  int i_sar_height;
  int i_sar_width; /* 設置長寬比 */

  int i_overscan; /* 0=undef, 1=no overscan, 2=overscan 過掃描線,默認"undef"(不設置),可選項:show(觀看)/crop(去除)*/

  /*見如下的值h264附件E */
  Int i_vidformat;/* 視頻格式,默認"undef",component/pal/ntsc/secam/mac/undef*/
  int b_fullrange; /*Specify full range samples setting,默認"off",可選項:off/on*/
  int i_colorprim; /*原始色度格式,默認"undef",可選項:undef/bt709/bt470m/bt470bg,smpte170m/smpte240m/film*/
  int i_transfer; /*轉換方式,默認"undef",可選項:undef/bt709/bt470m/bt470bg/linear,log100/log316/smpte170m/smpte240m*/
  int i_colmatrix; /*色度矩陣設置,默認"undef",undef/bt709/fcc/bt470bg,smpte170m/smpte240m/GBR/YCgCo*/
  int i_chroma_loc; /* both top & bottom色度樣本指定,範圍0~5,默認0 */
  } vui;

  int i_fps_num;
  int i_fps_den;
/*這兩個參數是由fps幀率肯定的,賦值的過程見下:
{ float fps;   
if( sscanf( value, "%d/%d", &p->i_fps_num, &p->i_fps_den ) == 2 )
  ;
  else if( sscanf( value, "%f", &fps ) )
  {
  p->i_fps_num = (int)(fps * 1000 + .5);
  p->i_fps_den = 1000;
  }
  else
  b_error = 1;
  }
Value的值就是fps。*/

  /*流參數 */
  int i_frame_reference; /* 參考幀最大數目 */
  int i_keyint_max; /* 在此間隔設置IDR關鍵幀 */
  int i_keyint_min; /* 場景切換少於次值編碼位I, 而不是 IDR. */
  int i_scenecut_threshold; /*如何積極地插入額外的I幀 */
  int i_bframe; /*兩個相關圖像間P幀的數目 */
  int i_bframe_adaptive; /*自適應B幀斷定*/
  int i_bframe_bias; /*控制插入B幀斷定,範圍-100~+100,越高越容易插入B幀,默認0*/
  int b_bframe_pyramid; /*容許部分B爲參考幀 */
/*去塊濾波器須要的參數*/
  int b_deblocking_filter;
  int i_deblocking_filter_alphac0; /* [-6, 6] -6 light filter, 6 strong */
  int i_deblocking_filter_beta; /* [-6, 6] idem */
  /*熵編碼 */
  int b_cabac;
  int i_cabac_init_idc;

  int b_interlaced; /* 隔行掃描 */
  /*量化 */
  int i_cqm_preset; /*自定義量化矩陣(CQM),初始化量化模式爲flat*/
  char *psz_cqm_file; /* JM format讀取JM格式的外部量化矩陣文件,自動忽略其餘—cqm 選項*/
  uint8_t cqm_4iy[16]; /* used only if i_cqm_preset == X264_CQM_CUSTOM */
  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; /*爲b幀隱式加權 */
  int i_direct_mv_pred; /*時間空間隊運動預測 */
  int i_chroma_qp_offset; /*色度量化步長偏移量 */

  int i_me_method; /* 運動估計算法 (X264_ME_*) */
  int i_me_range; /* 整像素運動估計搜索範圍 (from predicted mv) */
  int i_mv_range; /* 運動矢量最大長度(in pixels). -1 = auto, based on level */
  int i_mv_range_thread; /* 線程之間的最小空間. -1 = auto, based on number of threads. */
  int i_subpel_refine; /* 亞像素運動估計質量 */
  int b_chroma_me; /* 亞像素色度運動估計和P幀的模式選擇 */
  int b_mixed_references; /*容許每一個宏塊的分區在P幀有它本身的參考號*/
  int i_trellis; /* Trellis量化,對每一個8x8的塊尋找合適的量化值,須要CABAC,默認0 0:關閉1:只在最後編碼時使用2:一直使用*/
  int b_fast_pskip; /*快速P幀跳過檢測*/
  int b_dct_decimate; /* 在P-frames轉換參數域 */
  int i_noise_reduction; /*自適應僞盲區 */
  float f_psy_rd; /* Psy RD strength */
  float f_psy_trellis; /* Psy trellis strength */
  int b_psy; /* Toggle all psy optimizations */

  /*,亮度量化中使用的無效區大小*/
  int i_luma_deadzone[2]; /* {幀間, 幀內} */

  int b_psnr; /* 計算和打印PSNR信息 */
  int b_ssim; /*計算和打印SSIM信息*/
  } analyse;

  /* 碼率控制參數 */
  struct
  {
  int i_rc_method; /* X264_RC_* */

  int i_qp_constant; /* 0-51 */
  int i_qp_min; /*容許的最小量化值 */
  int i_qp_max; /*容許的最大量化值*/
  int i_qp_step; /*幀間最大量化步長 */

  int i_bitrate; /*設置平均碼率 */
  float f_rf_constant; /* 1pass VBR, nominal QP */
  float f_rate_tolerance;
  int i_vbv_max_bitrate; /*平均碼率模式下,最大瞬時碼率,默認0(與-B設置相同) */
  int i_vbv_buffer_size; /*碼率控制緩衝區的大小,單位kbit,默認0 */
  float f_vbv_buffer_init; /* <=1: fraction of buffer_size. >1: kbit碼率控制緩衝區數據保留的最大數據量與緩衝區大小之比,範圍0~1.0,默認0.9*/
  float f_ip_factor;
  float f_pb_factor;

  int i_aq_mode; /* psy adaptive QP. (X264_AQ_*) */
  float f_aq_strength;
  int b_mb_tree; /* Macroblock-tree ratecontrol. */
  int i_lookahead;

  /* 2pass 屢次壓縮碼率控制 */
  int b_stat_write; /* Enable stat writing in psz_stat_out */
  char *psz_stat_out;
  int b_stat_read; /* Read stat from psz_stat_in and use it */
  char *psz_stat_in;

  /* 2pass params (same as ffmpeg ones) */
  float f_qcompress; /* 0.0 => cbr, 1.0 => constant qp */
  float f_qblur; /*時間上模糊量化 */
  float f_complexity_blur; /* 時間上模糊複雜性 */
  x264_zone_t *zones; /* 碼率控制覆蓋 */
  int i_zones; /* number of zone_t's */
  char *psz_zones; /*指定區的另外一種方法*/
  } rc;

  /* Muxing parameters */
  int b_aud; /*生成訪問單元分隔符*/
  int b_repeat_headers; /* 在每一個關鍵幀前放置SPS/PPS*/
  int i_sps_id; /* SPS 和 PPS id 號 */

  /*切片(像條)參數 */
  int i_slice_max_size; /* 每片字節的最大數,包括預計的NAL開銷. */
  int i_slice_max_mbs; /* 每片宏塊的最大數,重寫 i_slice_count */
  int i_slice_count; /* 每幀的像條數目: 設置矩形像條. */

  /* Optional callback for freeing this x264_param_t when it is done being used.
  * Only used when the x264_param_t sits in memory for an indefinite period of time,
  * i.e. when an x264_param_t is passed to x264_t in an x264_picture_t or in zones.
  * Not used when x264_encoder_reconfig is called directly. */
  void (*param_free)( void* );
} x264_param_t;

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

相關文章
相關標籤/搜索