2008-09-15 39 views
2

我使用Windows Media Format SDK實時捕獲桌面並將其保存在WMV文件中(實際上這是我的項目過於簡單化了,但這是相關部分)。對於編碼,我使用的是Windows Media Video 9 Screen編解碼器,因爲它對於屏幕截圖非常高效,並且因爲幾乎每個人都可以使用它,而無需安裝任何東西,因爲編解碼器包含在Windows Media Player 9運行時(包含在Windows XP SP1中) 。使用Windows Media Format(WMF)捕獲桌面

我正在使用GDI函數進行BITMAP屏幕截圖,並將這些BITMAPs提供給編碼器。正如你所猜測的那樣,用GDI進行屏幕截圖很慢,而且我沒有得到屏幕光標,我必須手動添加到BITMAP中。我最初得到的BITMAP是DDB,我需要將它們轉換爲DIB才能理解(RGB輸入),這需要更多時間。

觸發一個分析器顯示大約50%的時間花在編碼器WMVCORE.DLL中。這是可以預料的,當然編碼是CPU密集型的。

問題是,有一種叫做Windows Media Encoder的SDK,它可以使用所需的編解碼器以更簡單,更友善的方式執行屏幕截圖。

WME基於WMF。這是一個更高槓杆庫,也有.NET綁定。我不能在我的項目中使用它,因爲這帶來了我不得不避免的不需要的依賴關係。

我在問WME用於將採樣數據提供給WMV編碼器的方法。 WME的編碼與使用WMF的應用程序完全相同。 WME比我的應用程序更高效,因爲它具有更高效的將視頻數據提供給編碼器的方式。它不依賴於緩慢的GDI函數和DDB-> DIB轉換。

它是如何完成的?

回答

0

它已經我已經好久沒做過任何的Win32編碼,但據我所知,WMF的格式基本上這可以解釋爲什麼它是更有效編碼的GDI命令及其參數列表...

您可能需要掛鉤到最高級別的GDI上下文(就像Remote Desktop所做的那樣,我猜),並在調用它們時捕獲GDI命令。我似乎記得有創建一個WMF輸出GDI上下文的方式,這意味着你可能只能以某種方式委託給它。

我猜在這裏,但你可以找到上述的TightVNC的/ QuickVNC用於Windows項目的示例代碼,因爲他們將不得不做這樣的事情捕捉一種有效的方式在屏幕上的變化。

+0

我想你正在考慮Windows圖元文件,這與Windows Media Format(一個音頻/視頻編碼器)不是一回事。 – jeffm 2008-10-07 14:53:20

1

CamStudio的來源,GPL的屏幕錄製應用程序已經存在多年(商業版,然後打開srcd後)可能會有用嗎?

http://sourceforge.net/project/showfiles.php?group_id=131922

我建議在VNC客戶端的膽量找過,但他們很可能非常簡單(我想就可以抓取截圖,然後jpg'ing自上次捕獲已更改的瓷磚)。

如果CPU運算量過大,您可能會考慮不使用WMV9作爲動態編碼的編碼器嗎?也許使用HyperCam使用的較舊的效率較低的壓縮器(如MS RLE),然後再壓縮爲WMV?MS RLE一直以來默認的安裝至少在Win2000我相信: http://wiki.multimedia.cx/index.php?title=Microsoft_RLE

了CamStudio的無損編解碼器是GPL(上面的鏈接中),提供了相當不錯的壓縮(雖然你需要捆綁的dll在您的安裝)並且可以在飛行中使用,它可以在所有現代系統上高壓縮的情況下運行良好。

0

你檢查了BB FlashBack庫嗎?

我在類似的追捕中,並且我剛剛開始評估BB FlashBack庫。

我不確定外部依賴關係或安裝足跡。它似乎有必須安裝的專有編解碼器,但編解碼器的安裝可以通過公開的BB FlashBack API進行處理。

當心,有許可限制(許可證密鑰,運行時設置...)

我可以從SDK通過電子郵件發送給您的CHM,如果你想提交到授權之前評估API下載。

事情我在評估之中: WPF的正確捕獲意見 鼠標光標跟蹤 存儲電影 如何沒有專用的編解碼器顯示存儲的電影(即SWF出口)

--Batgar

的大小