李红升
(西安铁路职业技术学院,710600)
在远程视频监控中,视频快速捕捉与存储技术是决定其性能关键点之一,而随着计算机功能的不断强大,多媒体技术特别是数字图像技术的不断发展,为只依靠软件技术快速抓取计算机屏幕的监控画面,并将其转化成可供传输与预览的视频流资源,提供了可能。本文将在屏幕DC方法的基础上,结合内存映射文件技术加快写屏的思想,提出一种优化屏幕信息采集的新方法。并将连续捕捉到的图像合成为AVI视频流,使之能够预览播放。
通常获取屏幕图像的方法有两种:创建屏幕DC(Device Context,设备描述表)方法以及DirectX的方法,两种方法各自具有优缺点。屏幕DC方法适应范围广泛,但是截图速率低,DirectX方法截图速率高,但是需要安装软件,为程序开发和应用带来不便。
在屏幕DC截图的基础上,利用内存映射文件技术MVF(map view of file),可以将磁盘文件映射到虚拟内存的一块地址空间,在访问文件时就像访问内存文件一样,从而加快了采集速度,较好的解决了屏幕DC截图速度慢的缺点。优化后的屏幕DC截图法将有更好的应用价值。
DC(Device Context,设备描述表)是一个定义一组图形对象及其属性、影响输出的图形方式(数据)结构。Windows提供设备描述表,用于应用程序和物理设备之间进行交互,从而提供了应用程序设计的平台无关性。DC与显示设备具有一定的对应关系,在 Windows GDI(Graphics Device Interface,图形设备接口)界面下,总是相关屏幕上的某个显示区域,具体程序操作时可以不关心是哪一种具体的设备。
DirectX软件开发包是微软公司提供的一套在Windows操作系统上开发的高性能图形、声音、输入、输出和网络游戏的编程接口。DirectDraw是DirectX中的关于视频输入输出的基本部分,使用DirectDraw可以方便地编制出高效的视频处理程序。它支持在所有视频适配器上显示图形的标准方法,并且使用加速驱动程序时可以更快更直接地访问。
WIN32 API提供了一种进行文件操作的高效途径,即内存映射文件。内存映射文件允许在WIN32进程的虚拟地址空间中保留一段内存区域,并将物理存储器中目标文件提交给该区域,映射到这段虚拟内存之中。我们可以用存取内存数据的方式直接操作文件中的数据,如同这些数据放在内存中一样,简化了对文件的访问操作,还可以实现多个进程共享数据。使用内存映射文件可以大大提高程序的运行效率。
视频资源采集系统运行在计算机上,首先需要将视频数据截取下来。本文在截图设计上是在屏幕DC截图法的基础上,结合内存文件映射法优化其读屏与写屏的速度,在视频资源播放时,能够根据视频的刷新率,设置截图速率,达到控制PC机处理数据量的效果。
在屏幕DC截图法中引入了Win32提供的一个新函数CreateDIBSection(),通过它可以创建一个存储DIB位的内存区域,既可以执行相应的GDI操作,又可以直接通过指向DIB位区域的指针方位DIB位区域。避免了图片资源选入后,转化为DDB在时间和空间上的开销,加快了读屏速度。CreateFileMapping()函数用来创建文件映射内核对象,不分配进程的地址空间,不占用内存空间,因此在实际应用中通常是一次性把整个文件创建为内存映射对象。
MapViewofFile()函数把文件中的数据映射到进程的地址空间中,UnmapViewOfFile()函数解除文件内存映射,系统将内存中的数据回写到磁盘。最后通过CloseHandle()函数关闭映射文件,释放内存空间。
在从内存中写文件时,使用内存文件映射法可以节省页面空间和程序启动的时间,特别是有利于方便应对同一台计算机上运行的多个进程能够相互之间共享数据的需求,从而文件资源能被多个进程所共享。
可供人观赏的视频流是由许许多多的单帧组成的,根据人眼视觉的暂缓效应,帧在连续播放时,便形成了连续的动画,因此视频流生成的基础是对视频元素的单帧获取与保存。本文将通过单帧截取的图像文件合成AVI视频流,AVI视频格式是目前最常用到的视频格式之一,是映射生成文件时可以不经过处理直接读取的一种资源格式。
在使用文件内存映射将文件数据映射到进程的地址空间中要调用MapViewOfFile()函数,需要指定数据文件的偏移地址以及待映射的长度。其中,文件的偏移地址由DWORD型的参数dwFileOffsetHigh和 dwFileOffsetLow组成的64位值来指定,而且必须是操作系统的分配粒度的整数倍,对于Windows操作系统,分配粒度固定为64KB,所以分页映射时,每页的起始位置startpos,必须为64KB的整数倍,如图2所示,一帧数据文件在分页时一般情况下会被分成n个64KB的小区块,如果最后剩余的空间不足64KB的分区时,系统会自动补齐。
图1 帧文件分页映射结构图Picture 1 The frame file paging mapping diagram
所以在生成基于AVI视频格式的视频流时,插入流中的每帧图像数据需要经过运算比较,以实际截取的数据帧插入视频流,生成AVI视频流工作流程。为了插入实际的帧文件,从每帧首地址开始,根据计算出的帧实际大小,按照顺序存储文件访问的方式设置指示帧文件的尾指针,这样子就避免了将用于补足部分的空文件插入视频流中。
本文通过对传统计算机屏幕截图方法的比较、分析和优化,结合内存映射文件法设计了在技术上实现较为直接、能够适应各种视频源文件、速度快捷的视频资源采集系统技术方案。相对于通常获取视频图像的两种方法:创建屏幕DC(Device Context,设备描述表)方法以及DirectX的方法,优化屏幕DC截图法在截图效率上有很大改进,既弥补了屏幕DC较慢的捕捉速度,同时也拥有适用范围广的优点,对于远程视频监控的计算机屏幕信息的采集等方面有很大的用途。
图2 生成AVI视频流工作流程图Picture 2 The generated AVI video streaming workflow diagram
[1]Kelly Dempski. DirectX实时渲染技术详解[M].于忠德,吴红艳,林锋 译.重庆:重庆大学出版社,2006
[2]邱岚,李翠华.Hook技术在视频截取中的应用研究与实现[J].厦门大学学报(自然科学版),2003,42(6),710-713.
[3]胡光东,李锦明,马游春,秦丽.内存映射文件在大容量采编数据处理中的应用[J].电脑编程技巧与维护,2009,16:54-55
[4]杨明元,任景光,刘未学.基于内存映射文件的仿真系统进程间数据[J].电子科技,2010,23(11),33-34.
[5]于慧彬,齐 鹏,梁 捷,杨逍.内存映射文件在大数据量海洋调查数据处理中的应用[J].海洋技术,2010,29(1),33-35.
[6]Gerald Millerson,Jim Owens.视频制作手册[M].李志坚译.北京:人民邮电出版社,2011