我正在用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值吗?
答案 0 :(得分:1)
您可以查看other screencasting software的来源,例如CamStudio,了解他们是如何做到的。
如果您的程序受磁盘限制(我怀疑它是),那么通过使用压缩(这就是大型名称程序,如Camtasia Studio,如何操作)可能会有所改善。
答案 1 :(得分:1)
使用圆形双倍或三重缓冲区存储位图并为每个帧发声,并使用单独的线程将位图和声音添加到avi。因此,数据收集在一个线程中,数据在循环(线程安全)缓冲区中,数据存储在另一个线程中。
答案 2 :(得分:1)
您是自己编写AVI文件吗?高尚的努力,但有API可以帮助完成这项任务。
如果您正在使用Windows平台,我建议您考虑使用DirectShow或Media Foundation API将音频和视频复制到磁盘。 DirectShow是用于在Windows平台上进行A / V捕获,流式传输和多路复用的 API。
This article on CodeProject谈及音频&视频同步问题和DirectShow用来克服这一困难的机制。
基本上,使用参考时钟并且帧是带时间戳的。
对于新人来说,这是一个非常有用的资源active DirectShow community。 TMH's website非常值得一试 - 他是MS MVP并且是社区的积极成员。
我希望这有帮助!
答案 3 :(得分:0)
您定位的操作系统是什么?如果您正在使用Windows XP,我将查看http://tmhare.mvps.org/downloads.htm处的一些DirectShow代码,特别是Filter Graph Library。