2011-02-17 33 views
0

我正在嘗試編寫錄製軟件,它可以將進入計算機的視頻流寫入avi文件。我使用OpenCV並附帶videoInput.h來處理directshow代碼。以防萬一它很重要我使用Visual Studio 2010作爲編譯器。OpenCV videoInput.h捕捉速度不同於寫入速度

我遇到的問題是錄製的文件播放速度比預覽文件快。不是很多,但足以讓人知道。例如:10秒的預覽大概是7秒的文件,所以每個人的移動速度都有點過快。

if(bWriteVideo) 
{ 
    writer=cvCreateVideoWriter(szFileName,CV_FOURCC('D','I','V','X'), 
           fps,cvSize(width, height),isColor); 
    if(!writer) return 1; 
} 

if(bDisplayVideo) 
    cvNamedWindow("video", 0); 

while(key != 'q') 
{ 
    if(VI.isFrameNew(nSource)) 
    { 
     VI.getPixels(nSource, yourBuffer1, false, true); 

     frame = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); 
     frame->imageData = (char*)yourBuffer1; 
     frame->imageDataOrigin = frame->imageData; 

     if(!frame) break; 

     // Display Image to Screen 
     if(bDisplayVideo) 
      cvShowImage("video" , frame); 

     if(bWriteVideo) 
      cvWriteFrame(writer, frame);  
    } 
     key = cvWaitKey (1000/fps);  
} 

回答

1

讓我們假設幀以30 FPS進入。您的代碼執行以下操作:

  • 如果新幀到達,然後保存它,然後等待1000/fps ms(即〜33.3 ms)。
  • 如果不是......那就等着。

假設保存一幀需要10ms。因此一次循環運行需要33.3毫秒(沒有傳入幀)或44.3毫秒(如果我們必須保存一個)。所以我們不會保存所有的(有時我們會在44.3 ms的時間內有兩個輸入幀,但我們只保存一個)。

因此,輸出視頻的每秒實時幀數少於30幀。如果我們以30 FPS的速度玩這個遊戲......這比現實要快!

所以儘量避免在循環結束時等待很多。例如,通過減少cvWaitKey調用佔用的時間量。 (例如,用100代替1000)。循環將每幀運行幾次,每次等待3.3毫秒,然後檢查一個新幀(如果有的話,保存它)。在最壞的情況下,這是10(節省)+3.3(等待)毫秒,所以在這段時間內我們不會錯過任何新幀。

+0

感謝幫助!我最終完全放棄了「cvWatiKey」,因爲它只能在OpenCV窗口生成時使用,並且最終這是一個控制檯應用程序,但是等待會減慢速度。 – Kerigan 2011-02-22 15:24:17