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

9
我有一个通过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的输出给出了比特率、帧率等信息,因此它正在接受命令并工作。

接下来,我在我的OpenCV捕获函数中使用了命名管道:

    $ ./cvcap.exe stream_pipe

cvcap.cpp的代码归结为:

    cv::VideoCapture *pIns = new cv::VideoCapture(argv[1]);

程序似乎在到达这一行时停止了,所以我想知道这是否是正确的方法。我以前从未使用过命名管道,也不确定这是否是正确的用法。此外,我不知道是否需要在OpenCV中处理命名管道 - 更改代码以接受此类输入。就像我说的,我的代码已经接受了文件和相机输入,我只是卡在了一个流上。我只听说过命名管道可以用于OpenCV - 我没有看到任何实际的代码或命令!
感谢您提供任何帮助或见解!
更新:
我认为命名管道可能不能按照我预期的方式工作。如this cygwin论坛帖子中所示:
问题在于Cygwin对fifo的实现非常有缺陷。我不建议将fifo用于除最简单应用之外的任何内容。
我可能需要找到另一种方法来完成这个任务。我尝试将ffmpeg的输出导入到普通文件中,然后让OpenCV同时读取该文件。这在某种程度上是有效的,但我想并发地从文件读取和写入可能会很危险--谁知道会发生什么!

我一直在尝试做类似的事情。你找到了一些解释管道/等的文章吗? - Utkarsh Sinha
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
1个回答

10
希望回答不算太晚,我之前尝试过同样的事情,这是我当时的做法。
OpenCV 的视频解码后端实际上是 ffmpeg,因此在 OpenCV 中可以使用它的全部功能。虽然并非所有接口都被公开,但你可以将 RTP 流地址发送到 OpenCV。
cap.open("rtp://xxx.xxx.xxx.xxx:1234");

重要提示:OpenCV无法访问受密码保护的RTP流。如果需要访问,您需要提供用户名和密码,但是OpenCV没有为此公开的API接口。


请问您能否提供用于将文件流传输到RTP的命令?您只使用了FFmpeg吗?还是需要安装其他软件? - user2565010
1
您好!请问如何使用OpenCV将图像写回RTMP流以通过网络发送?谢谢! - Bahramdun Adil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接