x264的一些引數設定對編碼效率的影響

2021-08-11 18:33:11 字數 4254 閱讀 9139

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

可以通過該介面設定

第二, 編碼複雜度

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。

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_num = (int)m_framerate;          

param.i_fps_den = 1;

param.i_keyint_max = m_framerate * 2;

// rc

這個不為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.i_vbv_max_bitrate=(int)((m_bitrate*1.2)/1000) ; // 平均位元速率模式下,最大瞬時位元速率,預設0(與-b設定相同)

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

param.i_log_level = x264_log_none;

if(( m_p264handle = x264_encoder_open(¶m)) == null) 

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

typedef struct x264_param_t

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

*/int b_psnr; /* 計算和列印psnr資訊 */

int b_ssim; /*計算和列印ssim資訊*/

} analyse;

/* 位元速率控制引數 */

struct

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好像新增了一些引數。

x264引數設定

引數名稱 對應x264引數 引數說明 預設值引數範圍 最大idr幀間隔 i keyint max 250最小idr幀間隔 i keyint min 該引數設定過小可能導致錯誤地插入idr幀,引數限制了插入idr幀的最小距離。建議設定等於幀速率。25最 幀數 i frame reference 表示p...

X264的引數設定

原始 不詳 i keyint 整數 最大idr幀間距,預設250 i min keyint 整數 最小idr幀間距,預設25 scenecut 整數 畫面動態變化限,當超出此值時插入i幀,預設40 pre scenecut 更快,但低精度的畫面動態檢測,需要多執行緒,並且在啟用多執行緒時自動開啟。b...

X264的引數設定

原始 不詳 i keyint 整數 最大idr幀間距,預設250 i min keyint 整數 最小idr幀間距,預設25 scenecut 整數 畫面動態變化限,當超出此值時插入i幀,預設40 pre scenecut 更快,但低精度的畫面動態檢測,需要多執行緒,並且在啟用多執行緒時自動開啟。b...