FFMPEG關於推流端降低延遲調節(一)


FFMPEG關於推流端降低延遲調節(一)

本文所寫的是調節推流端降低延遲能調節的一些方案,有不足請補充,其他端方向類似,例如降低采集緩存,減少編碼時間等等,如有需要請參考。本文以windows推流端為例做解釋。

1:減少采集緩存

    av_dict_set(&p_device_options,"rtbufsize",str_buf_size,0);
    av_dict_set(&p_device_options,"start_time_realtime",0,0);
rtbufsize是緩存的大小攝像頭和麥克風的數據采集出來之后會先放到這個buf中然后才能取出來做解碼或編碼,buf大小根據自己的需求算出來設定。

2:減少音頻采集sampels數量

    //設置了采樣率也無效,設置這個是為了讓音頻采集每次samples少一些。
    //buffer大小是以采樣率44100計算的,44100*30=1323000,即每次采集音頻samples = 1323個。
    av_dict_set(&p_device_options, "audio_buffer_size","30", 0);    
解釋下為什么要設置這個,音頻采集如果不設置一般是采集出來1920個samples,如果沒記錯android采集出來的samples更多應該超過10000個,這么多的samples做編碼的時候aac格式lc的profile只需要1024個samples,he的需要2048個,就需要循環編完之后才能再次去取新的麥克風數據,所以需要減少。

3:gopsize減少

編碼一旦有gopsize很大的時候或者用了opencodec,有些播放器會等待I幀,無形中增加延遲。

4:B幀減少

編碼時如果有B幀會再解碼時緩存很多幀數據才能解B幀,因此只留下I幀和P幀。

5:編碼形式修改

av_opt_set(cctext->priv_data, "preset", "superfast", 0); 
可根據圖像質量調整。

6:實時編碼

av_opt_set(cctext->priv_data, "tune", "zerolatency", 0);
一般的編碼時進去很多幀yuv數據才能出來一幀sps,pps ,sei(可選)+I幀 等等。減少編碼緩存會減少延遲。

7:圖像質量與編碼速度調節

        output_codec_context->me_range = p_TaskSreamInfo->VideoCodecInfo.me_range;  
        output_codec_context->max_qdiff = p_TaskSreamInfo->VideoCodecInfo.max_qdiff;  
        output_codec_context->qmin = p_TaskSreamInfo->VideoCodecInfo.qmin; //調節清晰度和編碼速度 //這個值調節編碼后輸出數據量越大輸出數據量越小,越大編碼速度越快,清晰度越差  
        output_codec_context->qmax = p_TaskSreamInfo->VideoCodecInfo.qmax; //調節清晰度和編碼速度 
這幾個參數需要跟圖像質量做平衡。
ref:https://blog.csdn.net/zhuweigangzwg/article/details/82223011


免責聲明!

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



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