如何优化我的屏幕录制工具?

4
我正在用C++开发一个屏幕录制工具。
它基本上捕获桌面帧并创建AVI文件。算法如下:
1. 创建线程:this->m_hThread=CreateThread(NULL,0,thScreenCapture,this,0,NULL); 2. 每秒钟(例如5fps)在thScreenCapture中捕获桌面。
3. 在Capture()函数中,将位图数据附加到AVI文件中:this->appendBitmapToAvi(this->avifile, bmp); 此工具还记录声音。因此,在方法thScreenCapture中,声音数据也被附加到AVI文件中。
问题在于,当每秒钟捕获6帧以上时(这取决于硬件配置),帧和声音之间会出现延迟。
我正在寻求一种优化算法的解决方案。一种解决方案可能是在内存中缓冲帧,而不是即时将所有帧附加到AVI文件中。但这会使代码更复杂,因为我必须处理在不同线程中捕获的声音数据。
你有什么建议可以增加此工具支持的fps值,而不会失去同步?

你应该考虑使用DirectShow(请参阅下面的答案)。它使用参考时钟和媒体帧的时间戳,以实现音频和视频的同步。尽管视频帧是离散的间隔,但音频帧通常在持续时间上有所变化。 - user206705
使用DirectX。你已经提高了进程/线程的优先级吗?除此之外,使用一个线程来捕获和预处理图像缓冲区,另一个线程来缩放、转换和处理其他任务。你也可以检测处理器/核心的数量,并为每个核心生成一个线程以推迟这个处理过程。不幸的是,我对音频一无所知。 - jweyrich
4个回答

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

A/V 帧必须同步!缓冲解决不了这个问题! - user206705
没错,我正在使用单独的线程收集视频和音频数据,但以同步方式将它们添加到avi文件中进行交错。 - Zafer
@freefallr 所以Zafer正在以交错的方式进行,这意味着在主线程中进行数据收集,而在另一个线程中进行存储会更合理。如果我说错了,请纠正我。 - Vite Falcon
我进行流媒体的方式是使用两个线程安全队列(音频和视频帧队列)。网络线程检索帧并将它们添加到适当的队列中。然后,源过滤器消耗这些队列。这都是标准理论。OP所查询的问题 - 即在AVI文件中同步A/V的问题 - 不会通过循环或三重缓冲解决。 - user206705

1

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

如果你在Windows平台上工作,我建议考虑使用DirectShowMedia Foundation API将音频和视频混合到磁盘上。 DirectShow是Windows平台上A / V捕获,流媒体和混合的API。

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

基本上,引用时钟被使用并且帧被时间戳标记。

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

希望这可以帮助你!


谢谢建议。我正在使用一个开源的AVI库,它运行得非常好。我已经解决了许多问题,比如添加MP3音频数据(需要额外的头信息,花费了数天时间才找到)。现在我需要加速我的捕获引擎。 - Zafer

1

你可以查看其他屏幕录制软件的源代码,例如CamStudio,以了解它们是如何实现的。

如果你的程序受到磁盘限制(我怀疑是这样),那么使用压缩可能会有所改善(这就是像Camtasia Studio这样的知名程序的操作方式)。


@Zafer:那么你就需要进行内存缓冲,或者开发自己的编解码器。这就是Camtasia人员所做的——我是指编写自己的编解码器。DivX和XviD适用于一般电影视频,但是对于屏幕录制,还有更多的优化可以进行。 - Billy ONeal
@M. Tibbits:Theora不是专为屏幕录制而优化的编解码器;它的表现不会比DivX和XviD好多少(实际上,可能还会更差)。 - Billy ONeal
1
看看 VNC 是如何压缩的,可能会有用。 - Prof. Falken
我宁愿查看FRAPS的工作方式。VNC可能会使用JPEG/PNG压缩,并仅传输更新的区域(矩形)。 - jweyrich
CamStudio使用VFW - 代码库非常过时。我并不是说不要从中学习,但请注意,VFW已被DirectShow取代,而DirectShow正在被Media Foundation取代。请注意,Media Foundation仅适用于Vista及更高版本,因此虽然大多数市场份额使用XP操作系统,但DirectShow是在Windows平台上开发这些应用程序的首选API。 - user206705
显示剩余2条评论

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

感谢提供的链接。我正在针对Win XP、Vista和7进行开发。 - Zafer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接