我正在开发C ++中的屏幕截图实用程序。

它基本上捕获桌面帧并创建一个AVI文件。该算法如下:

  1. 创建一个线程: this->m_hThread=CreateThread(NULL,0,thScreenCapture,this,0,NULL);
  2. 捕获台式机 thScreenCapture n次每秒(例如5 fps)。

    obj->Capture();

  3. 在Capture()中,将位图数据附加到AVI文件。

    this->appendBitmapToAvi(this->avifile, bmp);

该实用程序还记录了声音。因此,在方法thscreencapture中,还将声音数据附加到AVI文件中。

问题在于,当每秒捕获超过6帧(可能取决于硬件配置)时,帧和声音之间会发生滞后。

我正在寻找一种优化算法的解决方案。解决方案可能是在内存中缓冲框架,而不是将它们全部附加到即时的AVI文件中。但这使代码更加复杂,因为我必须处理在其他线程中捕获的声音数据。

您建议在不丢失同步的情况下增加该实用程序支持的FPS值?

有帮助吗?

解决方案

您是自己写AVI文件吗?高贵的努力,但是有一些API可以帮助完成这项任务。

如果您在Windows平台上工作,我建议您考虑使用 DirectShow 或者 媒体基金会 apis将音频和视频介绍为磁盘。 DirectShow是 在Windows平台上,用于A/V捕获,流和MUX的API。

有关Codeproject的本文 谈论音频和视频同步问题以及DirectShow用来克服这一难度的机制。

从本质上讲,使用参考时钟,并将框架时间戳。

有一个 主动直接藏书社区 对于新人们来说,这是一个非常有用的资源。 TMH的网站 值得一试 - 他是MS MVP,并且是社区的积极成员。

我希望这有帮助!

其他提示

您可以看一下来源 其他屏幕截图软件, , 如 卡姆斯塔迪奥, ,看看他们如何做。

如果您的程序是磁盘绑定的(我怀疑它是),那么使用压缩可能会有所改善(这就是Camtasia Studio等知名度程序的运作方式)

使用圆形的双重或三重缓冲区来存储位图并声音每个帧,并使用单独的线程将位图和声音添加到AVI中。因此,数据收集在一个线程中,数据在一个圆形(线程安全)缓冲区中,数据存储在另一个线程中。

您针对什么操作系统?如果tyou在Windows XP上工作 http://tmhare.mvps.org/downloads.htm, ,专门过滤图库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top