最新使用 FFmpeg 進行 H264 的編碼時,發現視頻編碼有延遲,不是實時編碼,進過一番研究發現,只要在調用 avcodec_open2 函數
打開編碼器時,設置 AVDictionary 參數即可,關鍵代碼如下:
avcodec_open2函數:
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
解決方案:
AVDictionary *param = NULL;
//H264, 設置為編碼延遲為立即編碼
if(c->codec_id == AV_CODEC_ID_H264)
{
av_dict_set(¶m, "preset", "superfast", 0);
av_dict_set(¶m, "tune", "zerolatency", 0);
}
//H.265
if(c->codec_id == AV_CODEC_ID_H265)
{
av_dict_set(¶m, "x265-params", "qp=20", 0);
av_dict_set(¶m, "preset", "ultrafast", 0);
av_dict_set(¶m, "tune", "zero-latency", 0);
}
//使用給定的AVCodec初始化AVCodecContext
還有這種方式:
// Set Option
AVDictionary *param = 0;
//H.264
if(pCodecCtx->codec_id == AV_CODEC_ID_H264) {
av_dict_set(?m, "preset", "slow", 0);
av_dict_set(?m, "tune", "zerolatency", 0);
}
//H.265
if(pCodecCtx->codec_id == AV_CODEC_ID_H265){
av_dict_set(¶m, "x265-params", "qp=20", 0);
av_dict_set(¶m, "preset", "ultrafast", 0);
av_dict_set(¶m, "tune", "zero-latency", 0);
}
//Dump Information 輸出格式信息
av_dump_format(pFormatCtx, 0, out_file, 1);
pCodec = avcodec_find_encoder(pCodecCtx->codec_id);
if (!pCodec){
printf("Can not find encoder! 沒有找到合適的編碼器!\n");
return -1;
}
if (avcodec_open2(pCodecCtx, pCodec,¶m) < 0){
printf("Failed to open encoder! 編碼器打開失敗!\n");
return -1;
}