4

我正在用 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 值而不会丢失同步?

4

4 回答 4

1

您可以查看其他截屏软件(例如CamStudio )的来源,了解他们是如何做到的。

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

于 2010-09-08T22:10:13.053 回答
1

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

于 2010-09-18T00:06:28.877 回答
1

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

如果您在 Windows 平台上工作,我建议考虑使用DirectShowMedia Foundation API 将音频和视频混合到磁盘。DirectShow 是Windows 平台上用于 ​​A/V 捕获、流式传输和复用的API。

CodeProject 上的这篇文章讨论了音频和视频同步问题以及 DirectShow 用来克服这个困难的机制。

本质上,使用了参考时钟,并且帧被加上时间戳。

有一个非常活跃的 DirectShow 社区,对于新手来说是非常有用的资源。 TMH 的网站非常值得一试——他是 MS MVP 并且是社区的活跃成员。

我希望这有帮助!

于 2010-09-20T08:02:53.557 回答
0

你的目标是什么操作系统?如果您在 Windows XP 上工作,我会查看http://tmhare.mvps.org/downloads.htm上的一些 DirectShow 代码,特别是 Filter Graph Library。

于 2010-09-09T15:12:25.677 回答