javacpp-ffmpeg系列:
javacpp-FFmpeg系列之1:視頻拉流解碼成YUVJ420P,並保存為jpg圖片
javacpp-FFmpeg系列之2:通用拉流解碼器,支持視頻拉流解碼並轉換為YUV、BGR24或RGB24等圖像像素數據
javacpp-FFmpeg系列之3: 圖像數據轉換(BGR與BufferdImage互轉,RGB與BufferdImage互轉)
補充:
javacpp-FFmpeg系列補充:FFmpeg解決avformat_find_stream_info檢索時間過長問題
前言:
在對實時媒體流進行拉流的時候,會遇到長時間無畫面,甚至有時候達到一分鍾,實在不能忍。於是開始定位問題所在,一開始懷疑是網絡問題,經過其他方式拉流(vlc)測試發現不是網絡的問題;那么只能是代碼的問題了,定位代碼時發現代碼一直阻塞在avformat_find_stream_info這里。
關於avformat_find_stream_info函數的補充:
avformat_find_stream_info這個函數的作用不僅會檢索視頻的一些信息(寬、高、幀率等),而且會持續的讀取和解碼一些視頻幀和音頻幀,讀取到的幀會放到緩存中。
一、解決辦法
(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秒
二、其他解決辦法
1、跳過avformat_find_stream_info函數
如果已知源流媒體源的信息,可以選擇跳過這個函數,直接設置給AVFormatContext設置參數;
2、嘗試手動讀取視頻幀和音頻幀進行解析
當然也可以嘗試讀取一幀視頻幀或音頻幀,可以讀取到一些基本信息