記錄一下最近對接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.延時降低:
-
pformatContext->flags |=AVFMT_FLAG_NOBUFFER;
-
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(¶m, “preset”, “fast”, 0);
av_dict_set(¶m, “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:零延遲,用在需要非常低的延遲的情況下,比如電視電話會議的編碼。