Preface前端
話說,在用暴風影音進行視頻播放的時候,利用其它的軟件對視頻進行截圖的時候,並不能截取到視頻的畫面,我這裏用QQ五筆的截圖功能截圖,效果以下ide
對於這種狀況,之前也常常趕上,可是也沒有想過爲何?
函數
能夠看見,黑屏的只是視頻播放界面,而播放列表與邊框均可以顯示!spa
而後我就在羣裏問了一下。視頻
有的說是暴風置頂了吧,這個我首先就排除了,即便是置頂了,也能夠截到圖。htm
小菜說是Paint重繪,截圖好像和重繪沒什麼關係吧。blog
另外從技術角度上看看,聽說暴風是VB編寫的,視頻渲染用的是微軟的程序接口,就是基於directx的,而後查了下directx的資料,根據百度百科的資料http://baike.baidu.com/view/15762.htm,看看directx顯示的原理接口
directx顯示原理get
一般咱們看到的屏幕上的數據,都是經過Primary Surface送至顯示器的,什麼是Primary Surface呢?中文叫作主顯示錶面,也就是說咱們當前看到的屏幕上的圖像數據是從這個表面來的,除了主表面外還有離屏表面,叫作OffScreenSuface。這種表面中的數據是不直接顯示在屏幕上的。it
如今多數的視頻播放軟件都是用DDraw寫的(加速),並且使用了一種叫作Overlay的表面。
那什麼是Overlay呢?
根據微軟官方:http://msdn.microsoft.com/en-us/library/aa916217.aspx,Overlay是純硬件支持的,DDraw並不會用軟件實現這種功能。這種Surface的特殊之處在於,它至關於蒙在屏幕上的一塊塑料板,也就是說,這個若是使用了這種Surface,那麼它就位於全部surface的最前端。顯示設備在向屏幕顯示數據的時候,會先判斷該位置是否有Overlay,若是有,就顯示Overlay中像素,若是沒有,就使用Primary Surface中的像素。
好了,咱們如今知道,暴風也是採用了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控制面板
這個方法是關掉了系統的DDraw加速,因此系統中全部其餘軟件也不能使用DDraw加速了。固然使用軟件自己的設置關掉加速也能夠,而後即可以截圖了。
獲取Overlay中的數據?
聽說使用Hook技術可能會辦到,可是這個技術,向來是被殺軟列入黑名單的,搞出來也得不償失,有興趣的童鞋去關注吧。。。
小結
在查閱資料以前,我對這個也是一點也不懂,而後經過各類百度谷歌微軟+實踐,對這個東西的原理也算是瞭解了。
因此,生活中處處都是知識,關鍵是須要一雙發現知識的眼睛,而後驗證它,突破它,創新它,最後代替它,哈哈