第一,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...