che*_*rad 9 opencv cygwin ffmpeg named-pipes
我有一个视频流进入rtp到ffmpeg,我想把它传输到我的OpenCV工具进行实时流处理.rtp链接正在工作,因为我能够将传入的数据发送到文件并播放(或者通过ffplay播放).我的OpenCV实现也很有用,因为我能够从文件和网络摄像头捕获视频.
问题是流向OpenCV.我听说这可以使用命名管道来完成.首先,我可以将ffmpeg输出流式传输到管道,然后让OpenCV打开此管道并开始处理.
我尝试过的:
我通过以下方式在我的cygwin bash中创建了一个命名管道:
$ mkfifo stream_pipe
Run Code Online (Sandbox Code Playgroud)
接下来,我使用我的ffmpeg命令从rtp中提取流并将其发送到管道:
$ ffmpeg -f avi -i rtp://xxx.xxx.xxx.xxx:1234 -f avi -y out.avi > stream_pipe
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是将流发送到命名管道的正确方法,但它似乎接受命令和工作,因为ffmpeg的输出给了我比特率,fps等.
接下来,我在OpenCV捕获函数中使用命名管道:
$ ./cvcap.exe stream_pipe
Run Code Online (Sandbox Code Playgroud)
其中cvcap.cpp的代码归结为:
cv::VideoCapture *pIns = new cv::VideoCapture(argv[1]);
Run Code Online (Sandbox Code Playgroud)
当达到这一行时,程序似乎挂了,所以,我想知道这是否是正确的方法.我以前从未使用过命名管道,我不确定这是否正确.另外,我不知道是否需要在OpenCV中以不同方式处理命名管道 - 更改代码以接受此类输入.就像我说的,我的代码已经接受了文件和摄像头输入,我只是挂在流进来.我只听说命名管道可以用于OpenCV - 我还没有看到任何实际的代码或命令!
任何帮助或见解表示赞赏!
更新:
我相信命名管道可能不按照我的意图工作.正如在这个 cygwin论坛帖子上看到的那样:
问题是Cygwin对fifos的实现是非常错误的.除了最简单的应用程序之外,我不建议使用fifos.
我可能需要找到另一种方法来做到这一点.我试图将ffmpeg输出管道传输到普通文件中,然后让OpenCV同时读取它.这在某种程度上起作用,但我想在同时从文件中读取和写入会很危险 - 谁知道会发生什么!
Sam*_*Sam 10
希望现在回答还为时不晚,但我前段时间尝试过同样的事情,这就是我做到的.
对于OpenCV的视频解码后端实际上是ffmpeg的,所以它的所有facitilites在OpenCV中可用.并非所有接口都被暴露,这会增加一些困难,但您可以将rtp流地址发送到OpenCV.
cap.open("rtp://xxx.xxx.xxx.xxx:1234");
Run Code Online (Sandbox Code Playgroud)
重要提示:OpenCV无法访问受密码保护的rtp流.为此,您需要提供用户名和密码,没有公开API.
归档时间: |
|
查看次数: |
15333 次 |
最近记录: |