我正在尝试编写将计算机中的视频流写入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 );
}
答案 0 :(得分:1)
让我们假设这些帧以30 FPS进入。您的代码执行以下操作:
我们假设保存一帧需要10毫秒。因此,一个循环运行需要33.3 ms(无传入帧)或44.3 ms(如果我们必须保存一个)。所以我们不会保存所有这些(有时我们将在44.3毫秒的时间内有两个传入的帧,但我们只保存一个)。
因此输出视频每实际秒数少于30帧。如果我们用30 FPS玩那个...那比现实快!
因此,尽量避免在循环结束时等待很多。例如,通过减少cvWaitKey调用占用的时间量。 (例如,用100替换1000.)循环将每帧运行几次,每次等待3.3毫秒,然后检查新帧(如果有,则保存它)。在最坏的情况下,这是10(保存)+ 3.3(等待)ms,因此在此期间我们不会错过任何新帧。