关于录屏软件的实现原理的猜想

        网上有不少录屏软件,可以将你的操作全部录制下来然后保存成SWF或者视频格式,用于教程制作非常方便。
        好象是去年的时候我用WMEncoder实现了一个。但WMEncoder有个严重的问题,就是一旦开始捕获后双击事件基本上就不能用了,所以我们经常看到的录屏软件应该不是基于这个实现的,应该是更底层的东西。前几天又有想法实现一个这样的软件,所以到网上找了下资料,发现根本找不着这方面的信息。所以自己猜想了下实现的方法。不过这两天又忙于另外一个东西了,所以这个想法还没有具体的实现。
        其实猜想的实现方法原理上很简单,这和视频文件的原理是有关的。众所周知,视频文件是以帧为播放单位的,这和最原始的电影胶片是一样的。在这里就不重复一遍电影的播放原理了。
        视频文件的格式一般都是一个头,然后加帧的列表的形式,而帧的数据最终肯定会被还原成一张位图,然后拷贝到显卡上进行显示。而这个过程是可逆的,也就是一张位图也是有方法转化成一种视频格式的帧(类似于解码器与编码器)那么我们不就可以每隔一断时间,截取当时整屏或者屏幕某块区域的位图(这个就简单多了,其实就是一个简单的截图而已)。然后将这个位图以及他的时间等信息存起来,这样当需要转化为某种格式时,只需将这些连续截取的图片构建成视频文件里连续的帧然后构造些头信息就可以了。当然这个间隔的设置,一般如果感觉不到卡的话为20毫秒,也就是0.02秒,因为人脑的反应速度就是这个。当然实际情况会比这个数要少,因为要考虑到机器的性能和你截屏以及保存的时间。 当然在实际处理的时候,你无须为每种格式都写一个构造器,只需实现一个最简单的,然后从网上找相应的格式转换的DLL就可以了。至于有些录屏软件上在鼠标点击的地方会出现一个提示(例如一个象瞄准镜的东西),你可以做一个全局系统钩子,记录下所有的事件及时间就可以了


        补充:经过试验,截屏效率有些低,但勉强可以忍受,存取图片的速度实在是太慢了,另外还有一个问题就是光标问题,截屏光标是没办法显示的。

所以为了解决这些问题思路是这样设想的:
1.截屏效率问题 截屏还是要截的,毕竟不截屏的实现是不存在的,只是截屏的方式改改,直接从内存中或者显卡内存中拷贝的话,效率应该就不会成什么问题了。
2.存储慢的问题 这个直接存储在磁盘上就忽略了,先缓存在内存中,达到一定程度在使用另外另一个线程异步压缩存取到磁盘。
3.光标问题 在每次截屏(直接拷贝的方式)的时候记录当前光标位置以及光标类型及其它相关信息,转化成视频帧,手动在那个位置再画一个光标出来


        再补:查了些资料,微软提供了一个AVI的创建生成等的开发包 vfw (vfw32.lib) 截图后使用这个可以生成AVI文件。


原文链接

你可能感兴趣的:(资料汇总)