【教程】探究暴風影音視頻截圖黑屏原因

Preface


   話說,在用暴風影音進行視頻播放的時候,利用其它的軟件對視頻進行截圖的時候,並不能截取到視頻的畫面,我這裏用QQ五筆的截圖功能截圖,效果如下

650) this.width=650;" src="http://img1.51cto.com/attachment/201305/131332838.jpg" title="暴風影音.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中的像素。

650) this.width=650;" src="http://img1.51cto.com/attachment/201305/140359201.jpg" title="Primary Surface.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控制面板

650) this.width=650;" src="http://img1.51cto.com/attachment/201305/144002542.jpg" title="dxdiag.jpg" />

   這個方法是關掉了系統的DDraw加速,所以系統中所有其他軟件也不能使用DDraw加速了。當然使用軟件本身的設置關掉加速也可以,然後便可以截圖了。

650) this.width=650;" src="http://img1.51cto.com/attachment/201305/144144320.jpg" title="暴風截圖.jpg" />



獲取Overlay中的數據?


   據說使用Hook技術可能會辦到,但是這個技術,向來是被殺軟列入黑名單的,搞出來也得不償失,有興趣的童鞋去關注吧。。。



小結


   在查閱資料之前,我對這個也是一點也不懂,然後通過各種百度谷歌微軟+實踐,對這個東西的原理也算是瞭解了。

   所以,生活中到處都是知識,關鍵是需要一雙發現知識的眼睛,然後驗證它,突破它,創新它,最後代替它,哈哈


本文出自 “成鵬致遠” 博客,請務必保留此出處http://infohacker.blog.51cto.com/6751239/1211253

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章