使用 ffmpeg 的 UDP 流式传输 - overrun_nonfatal 选项

新手上路,请多包涵

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

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

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

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

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

谢谢

原文由 Julien Greard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 973
2 个回答

相同的选项适用于命令行或 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

原文由 Grant 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

s->circular_buffer_size = 7*188*4096;

If you want a circular buffer of 50MB you should really set the fifo_size parameter to something closer to 50*1024*1024/188 otherwise 50000000 will give 50000000*188 bytes更接近 8965MB!

原文由 derke 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题