i_luma_deadzone[0]和i_luma_deadzone[1]分別對應inter和intra,html
取值範圍1~32,測試能夠得知,這連個參數的調整能夠對數據量有很大影響,值越大數據量相應越少,佔用帶寬越低;算法
本人使用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(¶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
//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(¶m, "baseline");
param.i_level_idc=30;
param.i_log_level = X264_LOG_NONE;
if(( m_p264Handle = x264_encoder_open(¶m)) == 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好像新增了一些參數。