ffmpeg使用筆記

記錄一下最近對接rtsp攝像頭的過程:

1.版本問題
使用2.8.15版本時
pformatContext=avformat_alloc_context();
load_options();
pformatContext->flags |=AVFMT_FLAG_NOBUFFER;
if((ret=avformat_open_input(&pformatContext,url.c_str(),NULL,&optionsDict))<0)

在open_input之前需要初始化,否則會異常,高版本似乎沒這個問題;

2.延時降低:

  1. pformatContext->flags |=AVFMT_FLAG_NOBUFFER;

  2. pcodecContext->flags |=CODEC_FLAG_LOW_DELAY;
    使用2時效果明顯,從500ms直接降到250ms,這部是解碼本地會緩存部分幀,這個設置可以消除緩存幀對延時的影響;

3.畫面問題:
void rtsp_camera::load_options()
{
optionsDict = NULL;
av_dict_set(&optionsDict, “rtsp_transport”, “udp”, 0);
av_dict_set(&optionsDict, “buffer_size”, “1024000”, 0);
av_dict_set(&optionsDict, “max_delay”, “500000”, 0);
av_dict_set(&optionsDict, “fflags”, “nobuffer”, 0);
av_dict_set(&optionsDict, “probsize”, “4096”, 0);
av_dict_set(&optionsDict, “packet-buffering”, “0”, 0);
av_dict_set(&optionsDict, “fps”, “30”, 0);
}

由udp改爲tcp傳輸畫面會變好,可能因爲我是網線直接連接,udp和tcp傳輸延時接近,沒什麼區別;

4.編碼延時減小的參數:
AVDictionary *param = 0;
av_dict_set(&param, “preset”, “fast”, 0);
av_dict_set(&param, “tune”, “zerolatency”, 0);

–preset的參數主要調節編碼速度和質量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo這10個選項,從快到慢。

–tune的參數主要配合視頻類型和視覺優化的參數,或特別的情況。如果視頻的內容符合其中一個可用的調整值又或者有其中需要,則可以使用此選項,否則建議不使用(如tune grain是爲高比特率的編碼而設計的)。

tune的值有: film: 電影、真人類型;

animation: 動畫;

grain: 需要保留大量的grain時用;

stillimage: 靜態圖像編碼時使用;

psnr: 爲提高psnr做了優化的參數;

ssim: 爲提高ssim做了優化的參數;

fastdecode: 可以快速解碼的參數;
zerolatency:零延遲,用在需要非常低的延遲的情況下,比如電視電話會議的編碼。

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