opencv - 从 ffmpeg 流式传输视频并使用 OpenCV 捕获

标签 opencv ffmpeg cygwin named-pipes

我有一个视频流通过 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——我还没有看到任何实际的代码或命令!

感谢任何帮助或见解!

更新:

我认为命名管道可能无法按我预期的方式工作。如上所示 this cygwin 论坛帖子:

The problem is that Cygwin's implementation of fifos is very buggy. I wouldn't recommend using fifos for anything but the simplest of applications.

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

最佳答案

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

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

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

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

关于opencv - 从 ffmpeg 流式传输视频并使用 OpenCV 捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7574554/

相关文章:

c++ - 进行 OCR 之前的预处理(tesseract、OpenCV)

python - OpenCV 安装成功但 ImportError : No module named 'cv2'

video - 带有 read_intervals 的 ffprobe 输出帧与给定时间范围不匹配

android - ffmpeg 使用单个图像和音频文件,但输出视频不可搜索(即使提前搜索也只能从 0 :00, 恢复)

cygwin startxwin.bat 不工作

gcc - cygwin 中奇怪的无声 cc1plus 错误

python - 如何在CNN中将OpenCV函数中的1d数组与向量展平

c++ - OpenCV c++ 断言在 cv::_InputArray::getMat 中失败 <i < 0>

java - IOException : Error running exec() Command, 调用FFmpeg方法时

android - 在 Android NDK 中编译 OpenCV