【问题标题】:Set RTSP/UDP buffer size in FFmpeg/LibAV在 FFmpeg/LibAV 中设置 RTSP/UDP 缓冲区大小
【发布时间】:2015-05-18 11:41:30
【问题描述】:

注意:我知道 ffmpeg 和 libav 是 different libraries。这是双方共同的问题。

免责声明:重复的SO question 标记为已回答,但实际上没有给出正确的解决方案。


UDP 缓冲区大小不足会导致多个高分辨率视频流的流中断。在 LibAV/FFMPEG 中,可以通过附加一些 options (buffer_size) 来设置 udp url (udp://...) 的 udp 缓冲区大小。

但是,对于 RTSP 网址,这是 not supported

这些是我找到的唯一解决方案:

  • 重建 ffmpeg/libav 更改 udp.c 源文件中的 UDP_MAX_PKT_SIZE。
  • 使用nasty hack 来查找和修改所需的值,方法是强制转换一些私有结构。
  • 使用不同的解码库(针对上述相关 SO question 提出的解决方案)。

这些都不是真正的解决方案。根据我的发现,应该可以使用 API 的 AVOptions 来查找和设置此值。或者,AVDictionary

在 libav 或 ffmpeg 的文档中很难找到如何设置这些。

更新:

感谢 Libav 开发者@lu_zero,以下补丁已提交给 Libav 以解决此问题:

这应该提供有关如何实现这些的提示,但这些仍然不能通过官方稳定的 API 获得。

【问题讨论】:

  • 我猜你可以增加默认的操作系统 UDP 缓冲区限制。 Improving UDP Peformance
  • 不适用于 Windows,它可能适用于其他平台.. 但仍应通过 API 设置。
  • 对于 Windows,请参阅question
  • 谢谢。但是我不想只为 Windows 解决它。此外,我知道应该只能在我的应用程序中这样做。只是API不清楚。

标签: ffmpeg udp rtsp buffer-overflow libav


【解决方案1】:

仅供参考,最新的 ffmpeg2.8.5 已经有这个选项。 我用它来设置buffer_size

av_dict_set(&options, "buffer_size", "655360", 0);

我得到了这个输出:

[udp @ 0xb4945090] 尝试将接收缓冲区的大小设置为 655360,但最终设置为 327680 经过一番搜索,我运行

echo 2097152 > /proc/sys/net/core/rmem_max

修复警告

【讨论】:

    【解决方案2】:

    由于this 提交,将buffer_size 作为选项传递就足够了,它通过rtp 协议转发到udp 协议。

    我进行了测试,它按预期工作。

    【讨论】:

    • TCP 怎么样?
    猜你喜欢
    • 2012-04-07
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多