2011-09-30 71 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

相關問題