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

Set RTSP/UDP buffer size in FFmpeg/LibAV

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

免责声明:重复的SO问题被标记为已回答,但实际上并未给出适当的解决方案。

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

但是,对于RTSP网址,不支持此功能。

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

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

这些都不是解决方案。从我发现的结果来看,应该可以使用API??的AVOptions来查找和设置该值。否则,AVDictionary。

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

更新:

由于Libav开发人员@lu_zero,已向Libav提交了以下补丁:

  • 添加buffer_size选项
  • 将urloptions映射到AVOptions

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


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

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

我得到了以下输出:

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

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

修复警告


由于此提交足以传递buffer_size作为选项,因此它通过rtp协议转发到udp协议。

我已经测试过,并且可以正常工作。