2011-09-27 52 views
8

我有一个视频流在rtp上进入ffmpeg,我想将它传递给我的OpenCV工具进行实时流式处理。 rtp链接正在工作,因为我可以将传入数据发送到文件并播放它(或通过ffplay播放)。我的OpenCV实现也很实用,因为我可以从文件和网络摄像头捕获视频。从ffmpeg流视频并使用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 - 我还没有看到任何实际的代码或命令!

感谢任何帮助或见解!

UPDATE:

我相信命名管道可能不会在我希望的方式来工作。如在this cygwin论坛帖子上看到的:

问题是Cygwin的fifos实现是非常麻烦的。我不会推荐使用fifos来做最简单的应用程序。

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

+0

我一直在尝试做类似的事情。你有没有找到一些解释管道/等的文章? –

+2

我在ffmpeg-users论坛上发现了这个小帖子http://ffmpeg-users.933282.n4.nabble.com/h264-problem-td2574908.html暗示他完成了什么,这给了我希望。我还发现有人试图用VLC http://forum.videolan.org/viewtopic.php?f=32&t=69351和类似的东西x264 http://forums.creativecow.net/readpost/291/84 – chembrad

回答

9

希望现在回答的时间不算太晚,但前段时间我尝试过同样的事情,下面是我如何做到的。

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

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

重要:OpenCV的是不能够访问受密码保护的RTP流。要做到这一点,你需要提供用户名和密码,没有暴露的API。

+0

你可以吗?请提及用于将文件流式传输到rtp的命令?你只使用ffmpeg吗?或者你是否需要安装其他东西? – user2565010

+0

嗨,先生!您可以说如何使用opencv将图像写回rtmp流以通过网络发送。谢谢! –