ffmpeg 編碼器AVCodecContext 的配置參數

1、先說一些基本的API

AVFormatContex * pFormatCtxEnc;
AVCodecContext * pCodecCtxEnc;

AVStream * video_st;
AVOutputFormat * pOutputFormat;

pOutputFormat = av_guess_format(NULL,/*文件名*/,NULL); //根據文件後綴來猜測文件的格式

pFormatCtxEnc = avformat_alloc_context();

pFormatCtxEnc->oformat = pOutputFormat;
video_st = avformat_new_stream(pFormatCtxEnc,0);

2、開始配置編碼器上下文的參數

/*AVCodecContext 相當於虛基類,需要用具體的編碼器實現來給他賦值*/
pCodecCtxEnc = video_st->codec; 

//編碼器的ID號,這裏我們自行指定爲264編碼器,實際上也可以根據video_st裏的codecID 參數賦值
pCodecCtxEnc->codec_id = AV_CODEC_ID_H264;

//編碼器編碼的數據類型
pCodecCtxEnc->codec_type = AVMEDIA_TYPE_VIDEO;

//目標的碼率,即採樣的碼率;顯然,採樣碼率越大,視頻大小越大
pCodecCtxEnc->bit_rate = 200000;

//固定允許的碼率誤差,數值越大,視頻越小
pCodecCtxEnc->bit_rate_tolerance = 4000000;

//編碼目標的視頻幀大小,以像素爲單位
pCodecCtxEnc->width = 640;
pCodecCtxEnc->height = 480;

//幀率的基本單位,我們用分數來表示,
//用分數來表示的原因是,有很多視頻的幀率是帶小數的eg:NTSC 使用的幀率是29.97
pCodecCtxEnc->time_base.den = 30;
pCodecCtxEnc->time_base = (AVRational){1,25};
pCodecCtxEnc->time_base.num = 1;

//像素的格式,也就是說採用什麼樣的色彩空間來表明一個像素點
pCodecCtxEnc->pix_fmt = PIX_FMT_YUV420P;

//每250幀插入1個I幀,I幀越少,視頻越小
pCodecCtxEnc->gop_size = 250;

//兩個非B幀之間允許出現多少個B幀數
//設置0表示不使用B幀
//b 幀越多,圖片越小
pCodecCtxEnc->max_b_frames = 0;

//運動估計
pCodecCtxEnc->pre_me = 2;

//設置最小和最大拉格朗日乘數
//拉格朗日乘數 是統計學用來檢測瞬間平均值的一種方法
pCodecCtxEnc->lmin = 1;
pCodecCtxEnc->lmax = 5;

//最大和最小量化係數
pCodecCtxEnc->qmin = 10;
pCodecCtxEnc->qmax = 50;

//因爲我們的量化係數q是在qmin和qmax之間浮動的,
//qblur表示這種浮動變化的變化程度,取值範圍0.0~1.0,取0表示不削減
pCodecCtxEnc->qblur = 0.0;

//空間複雜度的masking力度,取值範圍 0.0-1.0
pCodecCtxEnc->spatial_cplx_masking = 0.3;

//運動場景預判功能的力度,數值越大編碼時間越長
pCodecCtxEnc->me_pre_cmp = 2;

//採用(qmin/qmax的比值來控制碼率,1表示局部採用此方法,)
pCodecCtxEnc->rc_qsquish = 1;

//設置 i幀、p幀與B幀之間的量化係數q比例因子,這個值越大,B幀越不清楚
//B幀量化係數 = 前一個P幀的量化係數q * b_quant_factor + b_quant_offset
pCodecCtxEnc->b_quant_factor = 1.25;

//i幀、p幀與B幀的量化係數便宜量,便宜越大,B幀越不清楚
pCodecCtxEnc->b_quant_offset = 1.25;

//p和i的量化係數比例因子,越接近1,P幀越清楚
//p的量化係數 = I幀的量化係數 * i_quant_factor + i_quant_offset
pCodecCtxEnc->i_quant_factor = 0.8;
pCodecCtxEnc->i_quant_offset = 0.0;

//碼率控制測率,宏定義,查API
pCodecCtxEnc->rc_strategy = 2;

//b幀的生成策略
pCodecCtxEnc->b_frame_strategy = 0;

//消除亮度和色度門限
pCodecCtxEnc->luma_elim_threshold = 0;
pCodecCtxEnc->chroma_elim_threshold = 0;

//DCT變換算法的設置,有7種設置,這個算法的設置是根據不同的CPU指令集來優化的取值範圍在0-7之間
pCodecCtxEnc->dct_algo = 0;

//這兩個參數表示對過亮或過暗的場景作masking的力度,0表示不作
pCodecCtxEnc->lumi_masking = 0.0;
pCodecCtxEnc->dark_masking = 0.0;

3、一些針對具體要求進行的配置

(1)x264編碼時延問題

方法一:

vcodec_encode_video2函數輸出的延時僅僅跟max_b_frames的設置有關,
想進行實時編碼,將max_b_frames設置爲0便沒有編碼延時了

方法二:

1、使用264的API設置編碼速度 
/**
 * ultrafast,superfast, veryfast, faster, fast, medium
 * slow, slower, veryslow, placebo. 這是x264編碼速度的選項
 */
 av_opt_set(m_context->priv_data,"preset","ultrafast",0);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章