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


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、嘗試手動讀取視頻幀和音頻幀進行解析

當然也可以嘗試讀取一幀視頻幀或音頻幀,可以讀取到一些基本信息

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM