如何优化我的截屏实用程序?

时间:2010-09-08 21:39:53

标签: c++ algorithm optimization screen-capture image-capture

我正在用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);

  4. 此实用程序还会录制声音。因此,在方法thScreenCapture中,声音数据也被附加到avi文件。

    问题是当每秒捕获超过6帧(这可能根据硬件配置而改变)时帧与声音之间出现滞后。

    我正在寻找优化算法的解决方案。解决方案可以是在内存中缓冲帧,而不是将它们全部附加到avi文件中。但这会使代码更复杂,因为我必须处理在不同线程中捕获的声音数据。

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

4 个答案:

答案 0 :(得分:1)

您可以查看other screencasting software的来源,例如CamStudio,了解他们是如何做到的。

如果您的程序受磁盘限制(我怀疑它是),那么通过使用压缩(这就是大型名称程序,如Camtasia Studio,如何操作)可能会有所改善。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

如果您正在使用Windows平台,我建议您考虑使用DirectShowMedia Foundation API将音频和视频复制到磁盘。 DirectShow是用于在Windows平台上进行A / V捕获,流式传输和多路复用的 API。

This article on CodeProject谈及音频&视频同步问题和DirectShow用来克服这一困难的机制。

基本上,使用参考时钟并且帧是带时间戳的。

对于新人来说,这是一个非常有用的资源active DirectShow communityTMH's website非常值得一试 - 他是MS MVP并且是社区的积极成员。

我希望这有帮助!

答案 3 :(得分:0)

您定位的操作系统是什么?如果您正在使用Windows XP,我将查看http://tmhare.mvps.org/downloads.htm处的一些DirectShow代码,特别是Filter Graph Library。