我有一个通过rtp传输到ffmpeg的视频流,我想将其传输到我的OpenCV工具中进行实时流处理。rtp链接正常工作,因为我能够将收到的数据发送到文件并播放它(或通过ffplay播放)。我的OpenCV实现也是可用的,因为我能够从文件和摄像头捕获视频。
问题在于流式传输到OpenCV。我听说可以使用命名管道来完成这个任务。首先,我可以将ffmpeg输出流式传输到管道中,然后让OpenCV打开这个管道并开始处理。
我尝试过以下操作:
在我的cygwin bash中创建一个命名管道:
程序似乎在到达这一行时停止了,所以我想知道这是否是正确的方法。我以前从未使用过命名管道,也不确定这是否是正确的用法。此外,我不知道是否需要在OpenCV中处理命名管道 - 更改代码以接受此类输入。就像我说的,我的代码已经接受了文件和相机输入,我只是卡在了一个流上。我只听说过命名管道可以用于OpenCV - 我没有看到任何实际的代码或命令!
感谢您提供任何帮助或见解!
更新:
我认为命名管道可能不能按照我预期的方式工作。如this cygwin论坛帖子中所示:
问题在于Cygwin对fifo的实现非常有缺陷。我不建议将fifo用于除最简单应用之外的任何内容。
我可能需要找到另一种方法来完成这个任务。我尝试将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的输出给出了比特率、帧率等信息,因此它正在接受命令并工作。
接下来,我在我的OpenCV捕获函数中使用了命名管道:
$ ./cvcap.exe stream_pipe
cvcap.cpp的代码归结为:
cv::VideoCapture *pIns = new cv::VideoCapture(argv[1]);
程序似乎在到达这一行时停止了,所以我想知道这是否是正确的方法。我以前从未使用过命名管道,也不确定这是否是正确的用法。此外,我不知道是否需要在OpenCV中处理命名管道 - 更改代码以接受此类输入。就像我说的,我的代码已经接受了文件和相机输入,我只是卡在了一个流上。我只听说过命名管道可以用于OpenCV - 我没有看到任何实际的代码或命令!
感谢您提供任何帮助或见解!
更新:
我认为命名管道可能不能按照我预期的方式工作。如this cygwin论坛帖子中所示:
问题在于Cygwin对fifo的实现非常有缺陷。我不建议将fifo用于除最简单应用之外的任何内容。
我可能需要找到另一种方法来完成这个任务。我尝试将ffmpeg的输出导入到普通文件中,然后让OpenCV同时读取该文件。这在某种程度上是有效的,但我想并发地从文件读取和写入可能会很危险--谁知道会发生什么!