javacpp-ffmpeg系列:java
javacpp-FFmpeg系列之1:視頻拉流解碼成YUVJ420P,並保存爲jpg圖片緩存
javacpp-FFmpeg系列之2:通用拉流解碼器,支持視頻拉流解碼並轉換爲YUV、BGR24或RGB24等圖像像素數據網絡
javacpp-FFmpeg系列之3: 圖像數據轉換(BGR與BufferdImage互轉,RGB與BufferdImage互轉)tcp
補充:函數
javacpp-FFmpeg系列補充:FFmpeg解決avformat_find_stream_info檢索時間過長問題測試
前言:ui
在對實時媒體流進行拉流的時候,會遇到長時間無畫面,甚至有時候達到一分鐘,實在不能忍。因而開始定位問題所在,一開始懷疑是網絡問題,通過其餘方式拉流(vlc)測試發現不是網絡的問題;那麼只能是代碼的問題了,定位代碼時發現代碼一直阻塞在avformat_find_stream_info這裏。.net
關於avformat_find_stream_info函數的補充:orm
avformat_find_stream_info這個函數的做用不只會檢索視頻的一些信息(寬、高、幀率等),並且會持續的讀取和解碼一些視頻幀和音頻幀,讀取到的幀會放到緩存中。視頻
1、解決辦法
(1)rtsp解決辦法
rtsp能夠經過設置rtsp_transport爲tcp的方式來下降檢索時長,相對於默認的udp的不少限制,tcp會更可靠
(2)rtsp/rtmp通用解決辦法
設置probesize,這個值能夠限制最大的讀取緩存,好比500*1024就是500k,500k能夠保證高清視頻也能夠讀取到一幀視頻幀,若是過小就會致使讀取不到完整視頻幀的問題,因此這個大小須要經過實際狀況進行控制。
設置max_analyze_duration,好比設置爲5 * AV_TIME_BASE,這個值能夠設置avformat_find_stream_info這個函數的持續時長,超過這個時間不結束也會結束,咱們設置爲5秒
2、其餘解決辦法
一、跳過avformat_find_stream_info函數
若是已知源流媒體源的信息,能夠選擇跳過這個函數,直接設置給AVFormatContext設置參數;
二、嘗試手動讀取視頻幀和音頻幀進行解析
固然也能夠嘗試讀取一幀視頻幀或音頻幀,能夠讀取到一些基本信息