开发者社区> 科技小能手> 正文

【探索】探究暴风影音视频截图黑屏原因

简介:
+关注继续查看

Preface


   话说,在用暴风影音进行视频播放的时候,利用其它的软件对视频进行截图的时候,并不能截取到视频的画面,我这里用QQ五笔的截图功能截图,效果如下

131332838.jpg


   对于这种情况,以前也经常遇上,但是也没有想过为什么?


   可以看见,黑屏的只是视频播放界面,而播放列表与边框都可以显示!

   然后我就在群里问了一下。

   有的说是暴风置顶了吧,这个我首先就排除了,即使是置顶了,也可以截到图。

   小菜说是Paint重绘,截图好像和重绘没什么关系吧。

   另外从技术角度上看看,据说暴风是VB编写的,视频渲染用的是微软的程序接口,就是基于directx的,然后查了下directx的资料,根据百度百科的资料http://baike.baidu.com/view/15762.htm,看看directx显示的原理



directx显示原理


   通常我们看到的屏幕上的数据,都是通过Primary Surface送至显示器的,什么是Primary Surface呢?中文叫做主显示表面,也就是说我们当前看到的屏幕上的图像数据是从这个表面来的,除了主表面外还有离屏表面,叫做OffScreenSuface。这种表面中的数据是不直接显示在屏幕上的。

现在多数的视频播放软件都是用DDraw写的(加速),而且使用了一种叫做Overlay的表面。

   那什么是Overlay呢?

   根据微软官方:http://msdn.microsoft.com/en-us/library/aa916217.aspxOverlay是纯硬件支持的,DDraw并不会用软件实现这种功能。这种Surface的特殊之处在于,它相当于蒙在屏幕上的一块塑料板,也就是说,这个如果使用了这种Surface,那么它就位于所有surface的最前端。显示设备在向屏幕显示数据的时候,会先判断该位置是否有Overlay,如果有,就显示Overlay中像素,如果没有,就使用Primary Surface中的像素。

140359201.jpg

   好了,我们现在知道,暴风也是采用了DDraw写的,而且使用了一种叫做Overlay的表面来加速,并且这种表面是纯硬件支持的,位于所有surface的最前端。



软件截图


   但是暴风软件自带的截图功能就可以截图,那截图黑屏就还有截图软件的原因了。

   由上面Overlay的分析知道,它是位于所有surface的最前端,而我们看到的屏幕上的数据,都是通过Primary Surface送至显示器的,会不会是Overlay把Primary Surface给挡住了,所以软件截不到图?

   如题,我们常用的截屏函数都是截取普通的primary surface中的数据,无法截取Overlay surface中的数据,而微软又没有提供公共的API来获取Overlay surface中的数据所以,当我们打开一个播放器来播放视频,截图的时候发现播放器窗口是黑的。原因就是这块区域正好对应着Overlay,然后当然就是截取不到的了,黑屏就不足为奇了。


   终上所述:黑屏是由于DDraw加速引起的!



解决截图黑屏


   既然Overlay是纯硬件支持的,那么我们是不是可以关掉DDraw加速呢?答案是可以的。

大多数软件除了DDraw的渲染模式之外,还提供了一种Software renderer模式,也就是软件模式,这种模式在DDraw加速不可用的时候才会使用,所以一个避免截图黑屏的办法就是关闭DDraw加速,强迫软件使用Software renderer模式,这样,Overlay surface就不存在了,也就不会黑屏了。


   我们在DirectX的控制面板可以关闭DDraw加速,如果安装了DirectX SDK,那么直接在运行栏里面输入dxdiag即可打开DirectX控制面板

144002542.jpg

   这个方法是关掉了系统的DDraw加速,所以系统中所有其他软件也不能使用DDraw加速了。当然使用软件本身的设置关掉加速也可以,然后便可以截图了。

144144320.jpg



获取Overlay中的数据?


   据说使用Hook技术可能会办到,但是这个技术,向来是被杀软列入黑名单的,搞出来也得不偿失,有兴趣的童鞋去关注吧。。。



小结


   在查阅资料之前,我对这个也是一点也不懂,然后通过各种百度谷歌微软+实践,对这个东西的原理也算是了解了。

   所以,生活中到处都是知识,关键是需要一双发现知识的眼睛,然后验证它,突破它,创新它,最后代替它,哈哈



本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1211253

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android 架构MVC MVP MVVM+实例(下)
实例 MVC实例 代码结构 1.在layout创建一个布局文件 2.实体类(User) 3.MVCLoginActivity MVP实例 代码结构 1.Model层 2.Presenter层 3.View层 MVVM实例 1.Model层 2.ViewModel层 3.View层 实例传送门
4 0
手把手教你快速搭建Struts2框架【详细教程,建议收藏】
手把手教你快速搭建Struts2框架【详细教程,建议收藏】
3 0
服务器端网页编程-前言
开始服务器端编程通常比客户端编程要简单,因为动态的页面倾向于执行非常类似的操作(从数据库中获取数据然后显示到一个页面中,确认用户输入的数据以及保存到一个数据库中,检查用户的权限和登陆用户,以及更多),并且它是用能使这些和其他的常见网页服务端操作变简单的网页框架来构建的。
4 0
JS的控制流程
Block 一个块语句可以用来管理零个或多个语句。该区块是由一对大括号分隔。 块声明: { StatementList } 通过var声明的变量没有块级作用域。在语句块里声明的变量作用域是其所在的函数或者 script 标签内,你可以在语句块外面访问到它。换句话说,语句块 不会生成一个新的作用域。尽管单独的语句块是合法的语句,但在JavaScript中你不会想使用单独的语句块,因为它们不像你想象的C或Java中的语句块那样处理事物。例如:
4 0
iOS逆向 12:Mach-O文件(上)
iOS逆向 12:Mach-O文件(上)
5 0
JS 声明
var 声明一个变量,可同时将其初始化为一个值。 变量声明,无论发生在何处,都在执行任何代码之前进行处理。用 var 声明的变量的作用域是它当前的执行上下文,它可以是嵌套的函数,也可以是声明在任何函数外的变量。如果你重新声明一个 JavaScript 变量,它将不会丢失其值。
4 0
js的严格模式(strict mode)
JavaScript 严格模式(strict mode)即在严格的条件下运行。 "use strict" 指令只允许出现在脚本或函数的开头。 为什么使用严格模式: 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为; 消除代码运行的一些不安全之处,保证代码运行的安全; 提高编译器效率,增加运行速度; 为未来新版本的Javascript做好铺垫。
4 0
JavaScript 对象入门使用JSON
JavaScript对象表示法(JSON)是用于将结构化数据表示为JavaScript对象的标准格式,通常用于在网站上表示和传输数据
3 0
[翻译] 国外大神的js 分号使用指南
• Required: When two statements are on the same line 必备: 当两个语句在同一行时 var i = 0; i++ // <-- semicolon obligatory // (but optional before newline) var i = 0 // <-- semicolon optional i++ // <-- semicolon optional • Optional: After statement
3 0
23705
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载