【发布时间】: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 同时读取它。这在一定程度上可行,但我认为同时从文件读取和写入可能很危险——谁知道会发生什么!
【问题讨论】:
-
我一直在尝试做类似的事情。您是否找到了一些解释管道/等的文章?
-
我在 ffmpeg-users 论坛中发现这个小帖子 ffmpeg-users.933282.n4.nabble.com/h264-problem-td2574908.html 暗示了他的成就,这给了我希望。我还发现有人尝试使用 VLC forum.videolan.org/viewtopic.php?f=32&t=69351 和类似的 x264 forums.creativecow.net/readpost/291/84
标签: opencv ffmpeg cygwin named-pipes