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

时间:2015-03-16 11:14:47

标签: ffmpeg udp rtsp buffer-overflow libav

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

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


UDP缓冲区大小不足会导致几个高分辨率视频流出现故障。在LibAV / FFMPEG中,可以通过向其添加一些options (buffer_size)来为udp urls(udp:// ...)设置udp缓冲区大小。

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

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

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

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

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

更新

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

哪些应提供如何实现这些的提示,但仍然无法通过官方稳定API提供。

2 个答案:

答案 0 :(得分:2)

this提交后,只需将buffer_size作为选项传递即可,并通过udp协议转发到rtp协议。

我测试过,它按预期工作。

答案 1 :(得分:2)

仅供参考,最新的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

修正警告