我正在使用ffmpeg在iDevice上播放udp流。 它確實可以成功播放視頻和音頻。ffmpeg:播放udp流
我已經在這裏了,下面的函數調用將花費很長的時間
avformat_find_stream_info
大約需要10秒來完成這一功能的執行的唯一問題。 我正在播放的媒體具有以下屬性:
MPEG-4 VIDEO v3 (DIV3)
RESOLUTION : 640x480
Frame rate : 25
任何想法如何解決這個延遲?
我正在使用ffmpeg在iDevice上播放udp流。 它確實可以成功播放視頻和音頻。ffmpeg:播放udp流
我已經在這裏了,下面的函數調用將花費很長的時間
avformat_find_stream_info
大約需要10秒來完成這一功能的執行的唯一問題。 我正在播放的媒體具有以下屬性:
MPEG-4 VIDEO v3 (DIV3)
RESOLUTION : 640x480
Frame rate : 25
任何想法如何解決這個延遲?
我意識到這是一個古老的問題,但我最近遇到了這個問題,所以雖然這可能不會幫助OP,我會爲後人的緣故放下一個答案。
簡短的回答:
設置AVFormatContext
字段probesize
和/或max_analyze_duration
的東西比默認小,即
std::string url_path = "...";
AVFormatContext *format_ctx = NULL;
avformat_open_input(&format_ctx, url_path.c_str(), NULL, NULL);
format_ctx->max_analyze_duration = 50000;
avformat_find_stream_info(format_ctx, NULL);
對於較長的答案:
avformat_find_stream_info
從讀輸入數據流並嘗試根據它看到的數據包填寫AVFormatContext
。它可以在AVFormatContext
結構中設置爲max_analyze_duration
的值。
對於本地視頻文件,它通常會非常快,但對於網絡流,這可能需要很長時間(特別是在流被破壞的情況下)。這是avformat_find_stream_info
等待很長時間的地方。 max_analyze_duration
的默認值是5000000(以AV_TIME_BASE爲單位),這意味着假設avformat_find_stream_info
可以從輸入流中採樣數據包直至該持續時間(IIRC AV_TIME_BASE相當於微秒,所以默認最大等待時間是5秒) 。
通過設置max_analyze_duration
到更小的東西,說50000(〜500毫秒),我們迫使avformat_find_stream_info
選擇什麼AVFormatContext
字段是用更少的信息,同時限制最壞情況下的等待時間會更合理。根據我的經驗,這不會造成任何問題(儘管這可能取決於您的視頻源的方式)。 probesize
字段確定avformat_find_stream_info
可以從流中讀取的字節數。請注意,如果你設置這個值太低,你可能無法得到準確的編解碼器信息
50,000微秒〜50毫秒 – 2016-05-31 09:28:20
綜觀[文件](http://ffmpeg.org/doxygen/trunk/group__lavf__decoding.html#gd42172e27cddafb81096939783b157bb)這是可以理解的爲什麼它在設備上很慢。 'avformat_find_stream_info'旨在通過嘗試多個編解碼器來讀取無標題流來獲取編碼信息。該流沒有標題嗎? – Joe 2012-08-01 20:01:58
我用VLC流媒體,所以我想它與頭。你知道應該使用什麼,以及如何正確處理? – deimus 2012-08-01 20:51:02
我對它並不熟悉,但根據文檔'avformat_open_input'將獲得標題信息(如果可用),但它建議在沒有標題信息的情況下調用'avformat_find_stream_info'。 – Joe 2012-08-01 20:58:52