在FFmpeg/LibAV中设置RTSP/UDP缓冲区大小

7
注意:我知道ffmpeg和libav是不同的库。这是两者共同存在的问题。
免责声明:这是一个被标记为已回答,但实际上没有给出适当解决方案的SO问题的副本。

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

然而,对于RTSP url,这是不支持的

以下是我找到的唯一解决方案:

  • 重新构建ffmpeg/libav,更改udp.c源文件中的UDP_MAX_PKT_SIZE。
  • 使用恶劣的方法查找和修改所需值,通过转换某些私有结构。
  • 使用不同的解码库(提出了上述相关SO 问题的解决方案)。

这些都不是实际的解决方案。从我找到的资料来看,应该可以使用API的AVOptions来查找和设置此值。或者,使用AVDictionary

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

更新:

以下补丁已提交给Libav,处理了这个主题,感谢Libav开发人员@lu_zero

这应该提供了如何实现这些内容的提示,但这些还没有通过官方稳定的API进行发布。


1
你可以增加默认的操作系统UDP缓冲区限制,我猜这样会提高UDP性能。改善UDP性能 - aergistal
不适用于Windows,可能适用于其他平台..但仍应通过API进行设置。 - Sergio Basurco
1
对于Windows,请参见此问题 - aergistal
1
谢谢。然而,我不想仅为Windows解决它。此外,我知道应该可以在我的应用程序内部完成。只是API不够清晰。 - Sergio Basurco
2个回答

7

请注意,最新的ffmpeg2.8.5已经拥有此选项。

我使用它来设置缓冲区大小。

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

我得到了以下输出:

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

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

修复警告


3
自从这个提交以来,只需将buffer_size作为选项传递即可,它会通过rtp协议转发到udp协议。
我进行了测试,它的工作效果符合预期。

TCP怎么样? - user1315621
提交链接已损坏。 - Guy Lowe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接