OpenCV videoInput.h捕获速度与写入速度不同

时间:2011-02-17 22:12:28

标签: c++ opencv directshow video-capture

我正在尝试编写将计算机中的视频流写入avi文件的录制软件。我正在使用OpenCV并附带videoInput.h来处理directshow代码。以防万一我将Visual Studio 2010用作编译器。

我遇到的问题是录制的文件播放速度比预览文件快。不是很多,但足以引起注意。示例: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 个答案:

答案 0 :(得分:1)

让我们假设这些帧以30 FPS进入。您的代码执行以下操作:

  • 如果新帧到达,则保存,然后等待1000 / fps ms(即~33.3 ms)。
  • 如果没有......那就等一下。

我们假设保存一帧需要10毫秒。因此,一个循环运行需要33.3 ms(无传入帧)或44.3 ms(如果我们必须保存一个)。所以我们不会保存所有这些(有时我们将在44.3毫秒的时间内有两个传入的帧,但我们只保存一个)。

因此输出视频每实际秒数少于30帧。如果我们用30 FPS玩那个...那比现实快!

因此,尽量避免在循环结束时等待很多。例如,通过减少cvWaitKey调用占用的时间量。 (例如,用100替换1000.)循环将每帧运行几次,每次等待3.3毫秒,然后检查新帧(如果有,则保存它)。在最坏的情况下,这是10(保存)+ 3.3(等待)ms,因此在此期间我们不会错过任何新帧。