2012-08-01 194 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