覆盖表面视频信息的获取方法

文档序号:6410558阅读:117来源:国知局
专利名称:覆盖表面视频信息的获取方法
技术领域
本发明涉及屏幕捕获技术,尤其涉及一种覆盖表面视频信息的获取方法。
背景技术
目前大部分的媒体播放器均使用了Directx技术,而且对于现有的大部分显示卡,都可以使用Directdraw的Overlay(覆盖表面)技术显示活动视频。覆盖表面是具有显示卡支持能力的表面,通常用于显示活动视频、录制视频或静止位图。所述覆盖表面的支持完全由硬件即显示卡提供,DirectDraw支持显示设备驱动程序所支持的特性,DirectDraw不能仿真覆盖表面。
覆盖表面的工作原理同透明塑料纸覆盖的原理很相似,可以将所述覆盖表面想象为一片透明塑料纸,在这片塑料纸上画图并可将其放置在显示器前面。塑料纸覆盖在显示器前面时,可以看到覆盖表面和主表面,移去塑料纸后,主表面并没有改变。当显示一个覆盖表面时,就是告诉设备驱动程序在哪里怎样使覆盖表面可见,然后当显示设备扫描线重画到显示器上时,检查主表面上的每一个像素,看是否被覆盖表面所代替;如果是,显示卡就从覆盖表面中抽取相关像素的数据替代,显示卡在显示器上生成主表面和覆盖表面的合成表面,产生透明和拉伸效果而不需要改变每个表面的内容,所述合成表面通过视频数据流直接送到显示器进行显示。
由于覆盖表面处理和像素替代是硬件级的操作,能够用不同的像素格式无缝地合成主表面和覆盖表面,所以不存在明显的性能损失。
因此,如果播放器采用了覆盖表面的方式播放视频,视频内容出现在覆盖表面上,现有技术进行屏幕捕捉只是单纯捕捉主表面是无法得到覆盖表面的视频内容的,这样会造成抓取视频数据不是想要的视频数据甚至在视频窗口中呈现一片黑色。
现有技术只是单纯的抓取屏幕数据保存在本地,不能及时共享和发布给其他好友,在即时通信场合加入视频捕获特性,可以增强双方的沟通体验;另外,现有技术只能每次抓取一帧图像,不能一次抓取多帧图像并转换生成GIF(图形交换格式)文件。

发明内容
本发明提供一种覆盖表面视频信息的获取方法,解决现有技术中无法捕捉覆盖表面视频数据的问题。
为解决上述问题,本发明覆盖表面视频信息的获取方法包括以下步骤1)在当前应用程序的进程空间中建立新的组件对象实例;2)从该新组件对象中获取新组件对象模型接口指针;3)以所述新组件对象模型接口指针为首指针,进入链表,沿链表寻找所有保存的组件对象模型接口;4)调用当前组件对象指针获取覆盖表面指针;5)利用覆盖表面指针获得该覆盖表面的视频数据及特征信息;6)根据该覆盖表面的视频数据及特征信息重组再现图像。
进一步,步骤3)、4)之间包括判断该保存的组件对象模型接口的进程标识与当前的应用程序的进程标识是否相同;如果相同,则表示找到当前进程使用组件对象,返回该保存的组件对象模型接口指针及组件对象指针;如果保存的组件对象模型接口的进程标识与当前的应用程序的进程标识不相同,则更换另一版本的组件对象模型接口指针作为新组件对象模型接口指针执行步骤3)。判断该组件对象的主表面是否有覆盖表面标识且覆盖表面可见;若可以,执行步骤4);如果组件对象的主表面没有覆盖表面标识或者覆盖表面不可见,则返回或者抓取主表面进一步,所述视频信息为单帧获取,则再现图像以位图格式存储。
进一步,所述视频信息为多帧获取,则按预定帧数、时间间隔、缩放比例重复所述步骤1)至6),再现图像以图形交换格式存储。
进一步,所述视频数据指可以与三原色空间的转换的视频色差数据,通过覆盖表面指针获取保存该覆盖表面对应的视频数据的缓冲区的指针获得。
进一步,执行该方法之前包括步骤建立一个系统钩子程序,响应系统的键盘消息;当在播放器上按下一个指定的按键后,钩子程序开始执行下面步骤;判断当前的应用程序是否使用了DirectDraw,如果没有,则返回;如果有,则执行步骤1)。
与现有技术相比,本发明具有以下优点可以捕获覆盖表面的视频信息,并且可以完成静态和动态获取;再现的图像格式(静态获取采用位图格式,动态获取采用图形交换格式),则容易在网上及即时通信工具中传输和显示。


图1是本发明覆盖表面视频信息的获取方法流程图。
具体实施例方式
现有技术中屏幕捕获方法仅仅对主表面进行操作,而当采用覆盖表面显示时则无法获取覆盖表面的视频数据而无法获得确切的视频数据,所以必须能够获取到覆盖表面的视频信息才能够确切获得视频数据。
DirectDraw,通过DirectDraw对象(本申请文件中以组件对象作为其中文称谓)创建各种不同种类的“表面”(Surface),表面上的内容可以被自由地拷贝、组合,生成千变万化的图形。DirectDraw对象用来表示显示硬件,,可以用于查询和获取各种支持的组件对象模型接口(COM接口,致力于可重复利用接口资源的面向对象系统的基础)、设置协作等级,操作显示模式和显示表面。各个表面由相应的表面对象表示。在DirectDraw中通过对象指针访问对象进而访问对象代表的实体,通常APIs(应用程序编程接口)由对象和基于COM接口组成。
DirectDraw可以把表面创建在显示内存(显存)或系统内存中,而显示内存又分为常规显示内存和AGP加速图形接口内存。由于显示内存容量是有限的,所以每个表面具体应该创建在哪部分存储区域中应该统筹规划,一般将使用频繁,需要硬件加速或实现功能的表面安排在显示内存。如果您不指定表面创建的位置,DirectDraw将首先在常规显示内存创建表面,当常规显示内存不够时,若系统支持AGP内存,则先使用AGP内存,最终使用系统内存。
DirectDraw本质上是对显存进行管理,允许直接在显存里存储和操纵位图。利用视频硬件Bliter(位块传输器)在显存内部进行位图的Blit(位块传输)。
所述表面分以下几种类型(1)主表面(Primary Surface)即在屏幕上显示出来的表面;每个DirectDraw对象只能有一个主表面,主表面的尺寸、位置和格式由系统当前的显示模式决定,不能改动。
(2)离屏表面(Off-screen Surface)此类表面不能被直接看到。一般来说,后台表面往往用于作为游戏精灵动画、背景图形等部件的存储缓冲区。
(3)覆盖表面(Overlay Surface)位于显存,并且可以覆盖显示在主表面的任何位置,是一种由硬件支持的表面,DirectDraw不能仿真。为了防止覆盖表面遮盖主表面中的某些重要部分如菜单、对话框等,覆盖表面还高有色键功能,只有主表面中的颜色值与色键值相同时,覆盖表面才覆盖主表面。
当开始视频实时显示,首先启动DirectDraw接口(即组件对象模型接口),创建主表面和覆盖表面,并记录有关覆盖表面的信息,如尺寸、数据格式、内存地址等,同时为覆盖表面选择一个颜色作为色键,通常是洋红色。然后根据覆盖表面的信息初始化硬件设备,使DMA(存储器直接访问)设备将视频数据直接送入覆盖表面所在的显存中。当显示窗口移动或改变大小时,视频采集引擎会发送通知驱动程序更新显示,驱动程序应当在视频窗口中填充色键的颜色,并移动覆盖表面使其与视频窗口对齐。
请参照图1所示,本发明覆盖表面视频信息的获取方法,包括以下步骤1)在当前应用程序的进程空间中建立新的DirectDraw对象(组件对象)实例,因为使用组件对象模型接口必须先创建DirectDraw对象;2)从该新组件对象中获取新组件对象模型接口指针;3)由于系统所使用的所有的组件对象模型接口指针以链表的形式在内存中保存,以所述新组件对象模型接口指针为首指针,进入链表,沿链表寻找所有保存的组件对象模型接口;4)判断该保存的组件对象模型接口的进程标识与当前的应用程序的进程标识是否相同;5)如果相同,则表示找到当前进程使用组件对象,返回该保存的组件对象模型接口指针及组件对象指针;如果不同,则更换另一版本的组件对象模型接口指针作为新组件对象模型接口指针,重新执行步骤3);6)判断该组件对象的主表面是否有覆盖表面标识且覆盖表面可见,因为每个DirectDraw对象只能有一个主表面,所以覆盖表面依赖主表面存在;7)如果是,则调用当前组件对象指针获取覆盖表面指针;如果没有覆盖表面标识或覆盖表面不可见,则返回或抓取主表面视频信息;8)利用覆盖表面指针获得该覆盖表面的视频数据及特征信息,所述视频数据指可以与三原色空间的转换的视频色差数据,通过覆盖表面指针获取保存该覆盖表面对应的视频数据的缓冲区的指针获得;所述特征信息指视频数据的格式、长度,宽度、高度、跨度、视频数据的颜色位数以及保存视频数据的缓冲区指针;9)根据该覆盖表面的视频数据及特征信息重组再现图像,对应相应格式将视频色差数据转换成三原色空间的视频数据再根据。
如果所述视频信息为单帧获取,则再现图像以位图格式存储;如果所述视频信息为多帧(动画)获取,则按预定帧数、时间间隔、缩放比例重复所述步骤1)至9),再现图像以图形交换格式(GIF格式)存储。这样在网页可以直接显示动画;也可在支持GIF格式的即时通信工具中显示动画,传给好友观看。
执行该方法之前包括步骤建立一个系统钩子程序,响应系统的键盘消息;当在播放器上按下一个指定的按键后,钩子程序开始执行下面步骤;判断当前的应用程序是否使用了DirectDraw,如果没有,则返回;如果有,则执行步骤1)。
具体实施中,采用如下函数实现使用DirectDrawCreate函数创建组件对象。
IDirectDraw表示DirectDraw提供的COM接口,而IDirectdraw7则表示第七版本的COM接口;调用DirectDrawCreate API函数能够得到新建的组件对象指针;然后可以调用QueryInterface(IID_DirectDraw7,(Void**)&m_pDirectDraw7))函数取得IDirectdraw7的组件对象模型接口指针,即新组件对象模型接口指针。
以获得IDirectdraw7的组件对象模型接口指针为首指针,进入链表,判断向后的12个字节是否可以访问;如果可以访问,则判断该片内存的前四个字节的内容是否与IDirectdraw7对象句柄相同;如果相同,则表示找到保存IDirectdraw7对象信息的内存区域,然后调用pdwProcessID=(DWORD*)(((LPBYTE)*(pdwDirectDraw+1))+0x14),可以得到使用该组件对象接口(即IDirectdraw7)的进程标识(ID),其中用pdwDirectDraw表示该片内存区域;当前应用程序进程标识(ID)的获取方法为DWORD dwProcessID=GetCurrentProcessId();比较判断获得的IDirectdraw7的进程标识和当前应用程序进程标识;如果相同则表示找到当前进程使用组件对象,返回该保存的组件对象模型接口指针及组件对象指针。
调用组件对象的EnumSurfaces获得覆盖表面指针,具体调用为if(SUCCEEDED(pDirectDraw4->EnumSurfaces(DDENUMSURFACES_DOESEXIST,&ddsd2,this,EnumSurfacesCallback2)))得到的覆盖表面指针保存到m_m_pPrimaryDirectDrawSurface4成员变量中。
由于所有表面的特征信息填充在DDSURFACEDESC结构和DDPIXELFORMAT结构中,所以调用GetSurfaceDesc方法可以得到对覆盖表面的特征信息,如DDSURFACEDESC2 ddsd2={0};m_pPrimaryDirectDrawSurface4->GetSurfaceDesc(&ddsd2)抓取完毕后,将视频色差数据(YUV,一般为YUV2,YV12,YUYV,UYUV)转换为RGB(三原色)数据,保存并复制到剪贴板中供使用。
所述YUV到RGB的转换,遵循如下公式R=Y+1.403*(U-128)G=Y-0.344*(U-128)-0.714*(V-128)B=Y+1.773*(V-128)如果是静态抓拍(单帧获取),仅仅捕获到当前播放的一帧数据,只需要将缓冲区中的RGB数据生成BMP(位图)文件,并存储到剪切板中;如果是动态抓屏模式(多帧获取),则将缓冲区中的RGB数据根据应用指定的比例进行缩放后,插入到GIF的文件对象中;然后重复抓屏过程,直至生成指定帧数的GIF文件。
综上所述,本发明覆盖表面视频信息的获取方法可以捕获覆盖表面的视频信息,并且可以按一定格式重现图像/动画。
权利要求
1.一种覆盖表面视频信息的获取方法,包括以下步骤1)在当前应用程序的进程空间中建立新的组件对象实例;2)从该新组件对象中获取新组件对象模型接口指针;3)以所述新组件对象模型接口指针为首指针,进入链表,沿链表寻找所有保存的组件对象模型接口;4)调用当前组件对象指针获取覆盖表面指针;5)利用覆盖表面指针获得该覆盖表面的视频数据及特征信息;6)根据该覆盖表面的视频数据及特征信息重组再现图像。
2.如权利要求1所述的覆盖表面视频信息的获取方法,其特征在于,所述步骤(3)和步骤(4)之间还包括步骤判断该保存的组件对象模型接口的进程标识与当前的应用程序的进程标识是否相同;如果相同,则表示找到当前进程使用组件对象,返回该保存的组件对象模型接口指针及组件对象指针;如果保存的组件对象模型接口的进程标识与当前的应用程序的进程标识不相同,则更换另一版本的组件对象模型接口指针作为新组件对象模型接口指针执行步骤3)判断该组件对象的主表面是否有覆盖表面标识且覆盖表面可见;如果组件对象的主表面没有覆盖表面标识或者覆盖表面不可见,则返回或者抓取主表面。
3.如权利要求1所述的覆盖表面视频信息的获取方法,其特征在于,所述视频信息为单帧获取,则再现图像以位图格式存储。
4.如权利要求1所述的覆盖表面视频信息的获取方法,其特征在于,所述视频信息为多帧获取,则按预定帧数、时间间隔、缩放比例重复所述步骤1)至6),再现图像以图形交换格式存储。
5.如权利要求2或3所述的覆盖表面视频信息的获取方法,其特征在于,所述视频数据指可以与三原色空间的转换的视频色差数据,通过覆盖表面指针获取保存该覆盖表面对应的视频数据的缓冲区的指针获得。
6.如权利要求1至3任一项所述的覆盖表面视频信息的获取方法,其特征在于,执行该方法之前包括步骤建立一个系统钩子程序,响应系统的键盘消息;当在播放器上按下一个指定的按键后,钩子程序开始执行下面步骤;判断当前的应用程序是否使用了DirectDraw,如果没有,则返回;如果有,则执行步骤1)。
全文摘要
本发明公开一种覆盖表面视频信息的获取方法,包括以下步骤在当前应用程序的进程空间中建立新的组件对象实例;从该新组件对象中获取新组件对象模型接口指针;以所述新组件对象模型接口指针为首指针,进入链表,沿链表寻找所有保存的组件对象模型接口;调用当前组件对象指针获取覆盖表面指针;利用覆盖表面指针获得该覆盖表面的视频数据及特征信息;根据该覆盖表面的视频数据及特征信息重组再现图像。
文档编号G06F9/44GK1770096SQ20041005212
公开日2006年5月10日 申请日期2004年11月5日 优先权日2004年11月5日
发明者张禹, 梁柱, 文强, 刘奇勇, 刘程伟 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1