我正在使用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