FFMPEG H264/H265 編碼延遲問題


最新使用 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(&param, "x265-params", "qp=20", 0);  
        av_dict_set(&param, "preset", "ultrafast", 0);  
        av_dict_set(&param, "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,&param) < 0){  
        printf("Failed to open encoder! 編碼器打開失敗!\n");  
        return -1;  
    } 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM