2012-08-01 236 views
2

我正在使用ffmpeg在iDevice上播放udp流。 它確實可以成功播放視頻和音頻。ffmpeg:播放udp流

我已經在這裏了,下面的函數調用將花費很長的時間

avformat_find_stream_info 

大約需要10秒來完成這一功能的執行的唯一問題。 我正在播放的媒體具有以下屬性:

MPEG-4 VIDEO v3 (DIV3) 
RESOLUTION : 640x480 
Frame rate : 25 

任何想法如何解決這個延遲?

+0

綜觀[文件](http://ffmpeg.org/doxygen/trunk/group__lavf__decoding.html#gd42172e27cddafb81096939783b157bb)這是可以理解的爲什麼它在設備上很慢。 'avformat_find_stream_info'旨在通過嘗試多個編解碼器來讀取無標題流來獲取編碼信息。該流沒有標題嗎? – Joe 2012-08-01 20:01:58

+0

我用VLC流媒體,所以我想它與頭。你知道應該使用什麼,以及如何正確處理? – deimus 2012-08-01 20:51:02

+0

我對它並不熟悉,但根據文檔'avformat_open_input'將獲得標題信息(如果可用),但它建議在沒有標題信息的情況下調用'avformat_find_stream_info'。 – Joe 2012-08-01 20:58:52

回答

5

我意識到這是一個古老的問題,但我最近遇到了這個問題,所以雖然這可能不會幫助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可以從流中讀取的字節數。請注意,如果你設置這個值太低,你可能無法得到準確的編解碼器信息

+0

50,000微秒〜50毫秒 – 2016-05-31 09:28:20