gpt4 book ai didi

c++ - OpenCV videoInput.h 捕获速度不同于写入速度

转载 作者:行者123 更新时间:2023-11-28 08:23:15 26 4
gpt4 key购买 nike

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

我遇到的问题是录制文件的播放速度比预览文件快。不是很多,但足以引起注意。示例:10 秒的预览大约是 7 秒的文件,所以每个人的 Action 都有点太快了。

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 );
}

最佳答案

让我们假设帧以 30 FPS 的速度传入。您的代码执行以下操作:

  • 如果有新帧到达,则将其保存并等待 1000/fps 毫秒(即 ~33.3 毫秒)。
  • 如果没有……那就等着吧。

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

因此输出视频每秒将少于 30 帧。如果我们以 30 FPS 的速度玩游戏……那比现实中还要快!

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

关于c++ - OpenCV videoInput.h 捕获速度不同于写入速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5035316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com