在 FFmpeg/LibAV 中设置 RTSP/UDP 缓冲区大小
Set RTSP/UDP buffer size in FFmpeg/LibAV
注意:我知道 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 提出的解决方案)。
None这些实际上是一个解决方案。根据我的发现,应该可以使用 API 的 AVOptions
to find and set this value. Or else, the AVDictionary。
很难在 libav 或 ffmpeg 的文档中找到如何设置它们。
更新:
以下补丁已提交给 Libav 以解决此主题,感谢 Libav 开发人员 @lu_zero :
应该提供有关如何实现这些的提示,但这些还不能通过官方稳定版 API 获得。
自从 this 提交后,将 buffer_size
作为选项传递就足够了,它通过 rtp
协议转发到 udp
协议。
我测试过,它按预期工作。
仅供参考,最新的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
修复警告
注意:我知道 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 提出的解决方案)。
None这些实际上是一个解决方案。根据我的发现,应该可以使用 API 的 AVOptions
to find and set this value. Or else, the AVDictionary。
很难在 libav 或 ffmpeg 的文档中找到如何设置它们。
更新:
以下补丁已提交给 Libav 以解决此主题,感谢 Libav 开发人员 @lu_zero :
应该提供有关如何实现这些的提示,但这些还不能通过官方稳定版 API 获得。
自从 this 提交后,将 buffer_size
作为选项传递就足够了,它通过 rtp
协议转发到 udp
协议。
我测试过,它按预期工作。
仅供参考,最新的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
修复警告