如何优化屏幕截图实用程序?
-
01-10-2019 - |
题
我正在开发C ++中的屏幕截图实用程序。
它基本上捕获桌面帧并创建一个AVI文件。该算法如下:
- 创建一个线程:
this->m_hThread=CreateThread(NULL,0,thScreenCapture,this,0,NULL);
捕获台式机
thScreenCapture
n次每秒(例如5 fps)。obj->Capture();
在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,并且是社区的积极成员。
我希望这有帮助!
其他提示
使用圆形的双重或三重缓冲区来存储位图并声音每个帧,并使用单独的线程将位图和声音添加到AVI中。因此,数据收集在一个线程中,数据在一个圆形(线程安全)缓冲区中,数据存储在另一个线程中。
您针对什么操作系统?如果tyou在Windows XP上工作 http://tmhare.mvps.org/downloads.htm, ,专门过滤图库。