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

  • 2019 年 11 月 1 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/eguid_1/article/details/82754352

前言:

在對實時媒體流進行拉流的時候,會遇到長時間無畫面,甚至有時候達到一分鐘,實在不能忍。於是開始定位問題所在,一開始懷疑是網絡問題,經過其他方式拉流(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、嘗試手動讀取視頻幀和音頻幀進行解析

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