我可以创建虚拟网络摄像头并将数据流传输给它吗?

时间:2011-09-30 02:50:49

标签: opencv ffmpeg webcam

我希望将视频从ffmpeg流式传输到OpenCV(一个视频操作库),我很难过。我的想法是创建一个虚拟网络摄像头设备,然后将视频从ffmpeg流式传输到此设备,然后设备将像常规网络摄像头一样流式传输。我的动机是OpenCV。 OpenCV可以从网络摄像头中读取视频流并沿着它的方式进行。

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

2 个答案:

答案 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 :(得分:0)

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

如果您使用的是C,则等值为cvCaptureFromFilecvCaptureFromCAM