ffmpeg:播放udp流

dei*_*mus 2 iphone streaming ffmpeg objective-c ipad

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

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

avformat_find_stream_info
Run Code Online (Sandbox Code Playgroud)

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

MPEG-4 VIDEO v3 (DIV3)
RESOLUTION : 640x480
Frame rate : 25
Run Code Online (Sandbox Code Playgroud)

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

alr*_*kai 7

我意识到这是一个老问题,但我最近遇到了这个问题,所以虽然这可能对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);
Run Code Online (Sandbox Code Playgroud)

对于更长的答案:

avformat_find_stream_info从输入数据流中读取并尝试AVFormatContext根据它看到的数据包填写.它可以达到结构中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可以从流中读取的字节数.请注意,如果将此值设置得太低,则可能无法获得准确的编解码器信息