我有一个视频流进入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 - 我还没有看到任何实际的代码或命令!< / p>
感谢任何帮助或见解!
更新:
我认为命名管道可能无法按我预期的方式工作。正如this cygwin论坛帖子所见:
问题是Cygwin对fifos的实现是非常错误的。除了最简单的应用程序之外,我不建议使用fifos。
我可能需要找到另一种方法来做到这一点。我试图将ffmpeg输出管道传输到普通文件中,然后让OpenCV同时读取它。这在某种程度上起作用,但我想同时从文件中读取和写入会很危险 - 谁知道会发生什么!
答案 0 :(得分:9)
希望现在回答还不算太晚,但我前段时间尝试过同样的事情,这就是我做到的。
OpenCV的视频解码后端实际上是ffmpeg,所以它的所有功能都可以在OpenCV中使用。并非所有接口都被暴露,这会增加一些困难,但您可以将rtp流地址发送到OpenCV。
cap.open("rtp://xxx.xxx.xxx.xxx:1234");
重要:OpenCV无法访问受密码保护的rtp流。为此,您需要提供用户名和密码,没有公开API。