7

我正在开发一个使用 FFMPEG C++ 库从 UDP 流中获取数据的软件。

FFMPEG (1.2) 已实现并正在运行,但出现一些错误(采集崩溃和重新启动)。日志显示以下消息:

*循环缓冲区溢出。为避免,增加 fifo_size URL 选项。要在这种情况下生存,请使用 overrun_nonfatal 选项*

我在网上搜索了有关如何使用此选项的文档,但我只获得了有关在直接运行 ffmpeg 可执行文件时如何使用的信息。

有人知道如何在我的 C++ 代码中将正确的选项设置为: - 增加 fifo_size - 使用 overrun_nonfatal 选项

谢谢

4

2 回答 2

18

相同的选项适用于命令行或 C++ 库,您需要按如下方式修改您的 UDP URL:如果您的原始 URL 如下所示:

udp://@239.1.1.7:5107

添加 fifo_size 和 overrun 参数,如下所示:

"udp://@239.1.1.7:5107?overrun_nonfatal=1&fifo_size=50000000"

请记住用引号对 URL 进行转义。

overrun_nonfatal=1 阻止 ffmpeg 退出,它可以在大多数情况下恢复。

fifo_size=50000000 使用 50MB udp 输入缓冲区(默认 5MB)

唯一的文档在源代码中: http://git.videolan.org/?p=ffmpeg.git;a=blob;f=libavformat/udp.c;h=5b5c7cb7dfc1aed3f71ea0c3e980be54757d3c62;hb= dd0a9b78db0eeea72183bd3f5bc5fe51a5d3f537

于 2014-04-30T06:08:58.240 回答
18

我没有足够的声誉来评论其他答案,但如果我这样做了,我会说研究答案中链接的来源:

  • fifo_size根据行测量为 188 字节(数据包)的倍数:

    s->circular_buffer_size = strtol(buf, NULL, 10)*188;

  • 因此,尽管格兰特大致正确地认为“默认 5MB”,但由于以下行:

    s->circular_buffer_size = 7*188*4096;

如果你想要一个 50MB 的循环缓冲区,你应该将fifo_size参数设置为更接近的值,50*1024*1024/188否则50000000会给出50000000*188更接近 8965MB 的字节!

于 2016-07-19T00:42:35.840 回答