ffmpeg:播放 udp 流

Posted

技术标签:

【中文标题】ffmpeg:播放 udp 流【英文标题】:ffmpeg : playing udp stream 【发布时间】:2012-07-30 18:33:21 【问题描述】:

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

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

avformat_find_stream_info

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

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

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

【问题讨论】:

查看documentation 可以理解为什么它在设备上运行缓慢。 avformat_find_stream_info 旨在通过尝试多个编解码器来读取无标头流以获取编码信息。流没有标题吗? 我使用 VLC 进行流式传输,所以我猜它带有标题。你知道应该使用什么,以及如何正确处理吗? 我不熟悉它,但根据文档,avformat_open_input 将获取标头信息(如果有),但如果没有标头信息,建议致电avformat_find_stream_info 【参考方案1】:

我意识到这是一个老问题,但我最近遇到了这个问题,所以虽然这可能对 OP 没有帮助,但为了后代,我会写下答案。

简短的回答:

probesize 和/或max_analyze_durationAVFormatContext 字段设置为小于默认值,即

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。它最多可以对max_analyze_duration 结构中设置的AVFormatContext 值执行此操作。

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

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

【讨论】:

50,000 微秒 ~ 50 毫秒 仅供参考,如果您因为使用 ffmpeg 或 vlc 命令行而遇到此问题,您可以使用“analyzeduration”选项来覆盖它,但您需要使用 VLC 4 (目前是夜间)。

以上是关于ffmpeg:播放 udp 流的主要内容,如果未能解决你的问题,请参考以下文章

如何用FFMPEG分块记录UDP流?

FFmpegffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )

ffmpeg通过UDP协议将编码后的流发送到局域网电脑的某个端口上。

FFmpeg 播放 RTSP/Webcam 流

ffmpeg 从具有多个通道的输入中输出单独的通道

如何用ffmpeg播放抓包下来的pcap文件,是播放远端视频服务器时抓的UDP包