javacpp-FFmpeg系列補充:FFmpeg解決avformat_find_stream_info檢索時間過長問題

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設置參數;

二、嘗試手動讀取視頻幀和音頻幀進行解析

固然也能夠嘗試讀取一幀視頻幀或音頻幀,能夠讀取到一些基本信息

相關文章
相關標籤/搜索