5

我正在使用 ffmpeg 在 iDevice 上播放 udp 流。它确实成功地播放了视频和音频。

我在这里遇到的唯一问题是以下函数调用确实需要很长时间

avformat_find_stream_info

完成此功能的执行大约需要 10 秒。我正在播放的媒体具有以下属性:

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

任何想法如何解决这个延迟?

4

1 回答 1

8

我意识到这是一个老问题,但我最近遇到了这个问题,所以虽然这可能对 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_infoAVFormatContext从输入数据流中读取并尝试根据它看到的数据包来填写。它可以max_analyze_duration对结构中设置的值执行此操作AVFormatContext

例如,本地视频文件通常会非常快,但对于网络流,这可能需要很长时间(尤其是在流损坏的情况下)。这就是漫长的等待时间avformat_find_stream_info发挥作用的地方。默认值为max_analyze_duration5000000(以 AV_TIME_BASE 为单位),这意味着假设avformat_find_stream_info可以从输入流中采样数据包长达该持续时间(IIRC AV_TIME_BASE 相当于微秒,因此默认的最大等待时间为 5 秒)。

通过将 设置max_analyze_duration为更小的值,比如 50,000 (~500ms),我们强制avformat_find_stream_info选择AVFormatContext信息较少的字段,同时将最坏情况的等待时间限制为更合理的值。以我的经验,这并没有引起任何问题(尽管这可能取决于您的视频源)。该probesize字段确定avformat_find_stream_info可以从流中读取的字节数。请注意,如果您将此值设置得太低,您可能无法获得准确的编解码器信息

于 2013-08-21T23:40:15.103 回答