2011-09-30 284 views
2

我期待从ffmpeg到OpenCV(视频操作库)的视频流,我很难过。我的想法是创建一个虚拟摄像头设备,然后将来自ffmpeg的视频流传输到此设备,设备将反过来像一个普通的摄像头一样流。我的动机是OpenCV。 OpenCV可以从网络摄像头读取视频流,并顺其自然。我可以创建虚拟摄像头并将数据流传输到它吗?

但是这可能吗?我知道有创建虚拟摄像头的软件,但它可以接受视频流(如来自ffmpeg),并且可以像正常的网络摄像头一样传输视频吗? (如果这很重要,我正在cygwin环境中工作)

+0

我在寻找类似的解决方案。我想喂我自己的视频流到虚拟网络摄像头,就像正常的网络摄像头 –

回答

1

你不需要愚弄OpenCV认为该文件是一个摄像头。你只需要在每个帧之间添加一个延迟。此代码将做到这一点:

#include <iostream> 
#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 

using namespace cv; 

int main(int argc, const char * argv[]) { 

    VideoCapture cap; 
    cap.open("/Users/steve/Development/opencv2/opencv_extra/testdata/python/videos/bmp24.avi"); 
    if (!cap.isOpened()) { 
     printf("Unable to open video file\n"); 
     return -1; 
    } 
    Mat frame; 
    namedWindow("video", 1); 
    for(;;) { 
     cap >> frame; 
     if(!frame.data) 
      break; 
     imshow("video", frame); 
     if(waitKey(30) >= 0) //Show each frame for 30ms 
      break; 
    } 

    return 0; 
} 

编辑:试图从文件中读取被ffmpeg的创建:

for(;;) { 
     cap >> frame; 
     if(frame.data) 
      imshow("video", frame); //show frame if successfully loaded 
     if(waitKey(30) == 27) //Wait 30 ms. Quit if user presses escape 
      break; 
    } 

我不知道它会如何处理得到的部分帧在文件的末尾,而ffmpeg仍在创建它。

+1

嗯,但我想从ffmpeg实时做到这一点。我可以在OpenCV同时读取时从ffmpeg流式传输文件吗?我不想用ffmpeg制作一个文件,然后在OpenCV中打开它。 – chembrad

+1

哦,对不起,我误解了你在做什么。您当然可以尝试从ffmpeg正在创建的文件中读取。您想要更改for循环中的测试。我将编辑答案以显示我会尝试的内容。 – SSteve

0

听起来像你想要的是VideoCapture::Open,它可以打开视频设备和文件。

如果您使用C,则相当于cvCaptureFromFilecvCaptureFromCAM

+0

也许我应该更清楚。我已经在打开文件和网络摄像头方面取得了成功,但是当我试图将视频从ffmpeg流式传输到我的OpenCV C++工具时,我遇到了困难。所以我认为我可以创建一个虚拟摄像头,以便OpenCV认为来自它的视频是一个实际的设备......但我不确定这是否可能。 – chembrad

相关问题