【问题标题】:Stream video from ffmpeg and capture with OpenCV从 ffmpeg 流式传输视频并使用 OpenCV 捕获
【发布时间】:2011-11-26 08:03:53
【问题描述】:

我有一个通过 rtp 进入 ffmpeg 的视频流,我想将它通过管道传输到我的 OpenCV 工具以进行实时流处理。 rtp 链接正在工作,因为我能够将传入的数据发送到文件并播放它(或者如果通过 ffplay 播放)。我的 OpenCV 实现也很实用,因为我能够从文件和网络摄像头中捕获视频。

问题是流向 OpenCV。我听说这可以使用命名管道来完成。首先,我可以将 ffmpeg 输出流式传输到管道,然后让 OpenCV 打开此管道并开始处理。

我尝试过的:

我通过以下方式在我的 cygwin bash 中创建了一个命名管道:

    $ mkfifo stream_pipe

接下来我使用我的 ffmpeg 命令从 rtp 中提取流并将其发送到管道:

    $ ffmpeg -f avi -i rtp://xxx.xxx.xxx.xxx:1234 -f avi -y out.avi > stream_pipe

我不确定这是否是将流发送到命名管道的正确方法,但它似乎正在接受命令并工作,因为 ffmpeg 的输出为我提供了比特率、fps 等。

接下来我在我的 OpenCV 捕获函数中使用命名管道:

    $ ./cvcap.exe stream_pipe

cvcap.cpp 的代码归结为:

    cv::VideoCapture *pIns = new cv::VideoCapture(argv[1]);

到达这一行时程序似乎挂起,所以,我想知道这是否是正确的方法。我以前从未使用过命名管道,我不确定这是否是正确的用法。此外,我不知道是否需要在 OpenCV 中以不同方式处理命名管道——更改代码以接受这种输入。就像我说的,我的代码已经接受文件和相机输入,我只是挂断了一个流进来。我只听说命名管道可以用于 OpenCV——我还没有看到任何实际的代码或命令!

感谢任何帮助或见解!

更新:

我相信命名管道可能无法按我预期的方式工作。如thiscygwin 论坛帖子所示:

问题是 Cygwin 的 fifos 实现非常错误。除了最简单的应用程序,我不建议将 fifos 用于其他任何应用程序。

我可能需要找到另一种方法来做到这一点。我试图将 ffmpeg 输出通过管道传输到一个普通文件中,然后让 OpenCV 同时读取它。这在一定程度上可行,但我认为同时从文件读取和写入可能很危险——谁知道会发生什么!

【问题讨论】:

标签: opencv ffmpeg cygwin named-pipes


【解决方案1】:

希望现在回答还为时不晚,但我前段时间尝试过同样的事情,这就是我的做法。

OpenCV 的视频解码后端实际上是 ffmpeg,因此它的所有功能也可以在 OpenCV 中使用。并不是所有的接口都暴露出来,增加了一些困难,但是你可以将rtp流地址发送到OpenCV。

cap.open("rtp://xxx.xxx.xxx.xxx:1234");

重要提示:OpenCV 无法访问受密码保护的 rtp 流。为此,您需要提供用户名和密码,没有公开的 API。

【讨论】:

  • 能否请您提及用于将文件流式传输到 rtp 的命令?你只使用了ffmpeg吗?还是您必须安装其他东西?
  • 您好,先生!你能说一下如何使用opencv将图像写回rtmp流以通过网络发送。谢谢!
猜你喜欢
  • 2020-10-27
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2019-10-16
  • 2015-04-27
相关资源
最近更新 更多