编程截取播放器播放(不同进程)的当前画面(200分)

  • 主题发起人 happymanfreeman
  • 开始时间
H

happymanfreeman

Unregistered / Unconfirmed
GUEST, unregistred user!
各位朋友: 大家好!
许多截图软件都能截取播放器播放(不同进程)的当前画面, 保存为硬盘上的位图文件,
如何编程 ?? 这与hook com接口有关, 此处有说明
http://topic.csdn.net/t/20051106/11/4374651.html
以下摘录自上面的链接:
普通DX的方法不能截取通过Overlay硬件加速的视频图像的
这是没办法的
除非:关闭显卡的硬件加速功能
或者使用COM Hook技术实现!

思路是:采用独立DLL,做成全局热键Hook
挂钩DDraw的DirectDrawCreate,监控FDD.CreateSurface(ddsd, FDDSPrimary, nil)(需要COM Hook技术)
获得主表面,这个时候就可以通过主表面实现截图处理:
创建OffSurface离屏表面,用IDirectDrawSurface的BltFast从PrimarySurface复制数据到OffSurface,然后Lock离屏表面,这个时候就可以保存图像数据了

HypeeSnapDX,SnagIt等都是这样实现的

要弄Overlay截图,只能用Hook的方法

要有时间偶再实现它,COM Hook的方法是修改COM接口的VMT,比起API Hook来说,简单不少的

通过Hook DDraw的DirectDrawCreate(RealOne用)同DirectDrawCreateEx(WMP用)
获得IDirectDraw(7)
再COM Hook CreateSurface,注意RealOne使用的是通过QueryInterface获得IDirectDraw2
WMP则是IDirectDraw7

Hook了CreateSurface后,就能获得OverlaySurface

所以必须在软件使用前,启动全局Hook,才有效


在需要截图的时候
Lock Overlay Surface,读取数据,马上Unlock,以免损失性能

解码读出来的数据,即可,但是由于获得的数据是显卡硬件VRAM的数据,一般是YUY2,YV12等格式,需要转换为RGB格式

现在原数据能获取了,就差格式转换,有空再弄,不同的显卡,支持的格式不一样,不同的工具所使用的格式也不一样的,所以这个是比较麻烦的

例如,在我的GF6600上,RealOne(RMVB)用的是YUY2,而WMP(AVI)用的是YV12,还与当前播放的文件格式有关

最简单的方法是,Hook CreateSurface后,禁止创建Overlay那就普通的方法都能截图,呵呵

谁能用c++builder写出来呢 ?? 谢谢!!
 
介绍一个jsp 网站 http://bbs.8isp.cn/?u=233
 
请大家不要说与主题无关的东西, 谢谢合作!!
 
谁能用c++builder写出来呢 ?? 谢谢!!
 
请大家帮我找找针对性代码资料, 开源控件, 国外的也可以, .谢谢 !!
 
[?]学习中,愿有人能解决
 
以前学过COM, 不过已经忘记得一干二净。 现在是爱莫能助, 只能帮顶。
 
有没有把delphi代码自动转化为c++builder代码的工具 ?? 因为有人已经用delphi实现了!
http://topic.csdn.net/t/20051106/11/4374651.html (不过要卖钱)
 

Similar threads

回复
0
查看
811
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部