虛擬化之——視頻重定向技術

多媒體視頻播放,對於虛擬桌面來說是一個巨大的挑戰,視頻播放涉及到用戶體驗、音視頻同步、帶寬等多方面的考慮。正常的視頻播放過程,一般是將視頻文件讀取後,經過CPU解碼為圖像。虛擬機中的圖像數據需要經過網絡,發送到客戶端進行呈現。這樣一方面視頻解碼過程在服務器端會產生較大CPU壓力,另一方面解碼後的圖像數據流量很大,受網絡帶寬限制,最終呈現在客戶端上的畫面質量會很差,視頻播放不流暢。

虛擬化之——視頻重定向技術

目前在桌面虛擬化產品中,支持多媒體視頻播放,通常有兩種方式:一種是將服務端的多媒體視頻播放圖像重新進行視頻編碼處理,然後將視頻編碼數據傳輸到客戶端進行解碼播放顯示。另一種為視頻重定向方式,通過捕獲服務端播放器需要播放的視頻編碼流,直接將視頻編碼流發送到客戶端進行解碼播放顯示。我們一般稱之為視頻重定向技術。使用客戶端本地視頻重定向技術,通過系統插件將視頻解碼前的數據直接發送到客戶端,使用客戶端的CPU/GPU進行解碼,實現視頻文件的高清、高性能播放。這樣就解決了服務端視頻播放耗費的服務器性能、同時解決了網絡流量大導致視頻播放不流暢的問題。

虛擬化之——視頻重定向技術

根據以上技術原理圖顯示,初看上去視頻重定向方式效率較高,服務器端也少了視頻解碼與重新編碼的資源消耗,但實際上這種方式有很多限制條件,不具備廣泛的兼容性。具體原因如下:

第一種方式,因在虛擬機中的播放器對視頻進行了解碼,這裡會有較大的解碼CPU 資源消耗,再加上會對視頻區域進行重新編碼,此時CPU消耗更大,這樣會降低服務器的虛擬機密度。另外對視頻區域的動態識別,也是一個重要的技術點,通常是根據刷新頻率超過一定幀率的圖像變更區域來識別。

第二種方式,由於僅在服務器端截獲待解碼的視頻碼流,直接傳輸到客戶端進行解碼顯示,這樣對服務器端的開銷較小。是目前比較流行的技術,國內很多廠家基本上是針對Windows Media Player支持的視頻重定向技術,但是該技術在國內的實用性並不高,因為國內用戶使用Windows Media Player 播放器的很少,所以第二種方式的應用場景實際上比較受限。當然技術也在發展,對其他播放器能夠支持的多媒體重定向技術後續也在不斷出現,比如:暴風影音視頻重定向、QQ影音視頻重定向等。

關於視頻重定向的三種實現技術:

視頻重定向需要實現的功能是:視頻文件存放在服務器的虛擬桌面上,用戶使用客戶端遠程連接到服務器的虛擬桌面上,然後在虛擬桌面上運行播放器播放視頻文件。通過以下三種實現技術中的其中一種視頻重定向技術,虛擬桌面上播放的視頻文件能夠在客戶端上流暢的顯示出來,這樣用戶可以在客戶端遠程觀看虛擬桌面上的視頻資源。

下面介紹三種將視頻進行重定向的技術

1、基於播放器的視頻重定向

該技術是指在客戶端和用戶端分別實現一個播放器,在服務端分析視頻文件的組織方式,然後將未解碼的視頻數據傳輸到客戶端的播放器。客戶端的播放器然後解碼播放視頻數據。

基於播放器的視頻重定向的技術設計不需要很高的帶寬。但是該思路需要限制用戶使用特定的播放器。很多國內的場景選擇的這種方式,會在客戶端上安裝或者自定義一個特殊的播放器來獲取從虛擬機傳輸過來的視頻數據。

2、基於Hook技術的視頻重定向

技術原理:

鉤子(Hook)是Windows消息處理機制的一個平臺,應用程序可以在上面設置子進程以監視指定窗口的某種消息,而且所監視的窗口可以是其他進程所創建的。當消息到達後,在目標窗口處理函數之前處理它。鉤子機制允許應用程序截獲處理Windows消息或特定事件。

鉤子實際上是一個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。

Windows 有兩種鉤子,一種是特定線程鉤子(Thread specific hooks),一種是全局系統鉤子 (Systemwide hooks)。特定線程鉤子用於監視指定線程的事件消息。它的鉤子過程一般位於當前線程或當前線程創建的線程中。全局鉤子監視系統中所有線程的消息。因為全局鉤子會影響系統中所有的應用程序,所以鉤子過程必須放在獨立的動態鏈接庫(DLL) 中。系統會自動將這個含有鉤子過程(實質上是回調函數)的DLL映射到受鉤子過程影響的所有進程的地址空間中,也就是將這個DLL注入所有進程。

幾點說明:

1. 如果對於同一消息(如鼠標消息)既安裝了進程內鉤子又安裝了全局鉤子,那麼系統會優先調用進程內鉤子,然後調用全局鉤子。

2. 對於同一消息而言,可以安裝多個鉤子,消息被當前鉤子的鉤子過程處理完畢後應該把這個消息繼續傳遞給下一個鉤子。

3. 鉤子特別是全局鉤子會降低消息處理效率,影響系統性能,因此只有在必要的時候才安裝鉤子,在使用完畢後應及時卸載。

基於Hook技術的視頻重定向技術是指在播放器調用Windows函數時截獲視頻數據。當播放器解碼視頻數據時,一般會使用系統提供的解碼函數,使用Hook技術在播放器調用解碼函數時將視頻數據截獲,然後傳輸到客戶端解碼顯示。由於在Windows的解碼函數層次截獲視頻數據,該技術支持大多數的播放器。

實際效果:

Hook視頻重定向技術傳輸壓縮數據的方式可以實現在較低的帶寬下實現視頻重定向,並且支持用戶在服務端使用第三方播放器。然而Hook技術需要指定截獲函數調用的對象,一個新播放器的出現,或者播放器的名字改變都會導致Hook技術失效。Windows解碼相關的函數隨著Windows的更新而改變也會導致Hook技術失效。

3、基於WDDM驅動的視頻重定向

技術原理:

WDDM(Windows Display Driver Model)是微軟新一代的圖形驅動程序模型。是對舊版的Windows XP上的XPDM架構的改良,XPDM使用2D 的GDI(Graphics Device Interface)或 GDI+,與XPDM相比,WDDM是3D加速桌面,最早應用於WIndows Vista系統中。Window7 系統支持 WDDM 1.1。而隨著windows8 的出現,WDDM再次更新至WDDM1.2版本。Windows8.1(Windows Blue)則將WDDM的版本更新到1.3,隨著windows10出現,WDDM再次更新至WDDM 2.0版本,支持DX12。在某些桌面雲場景下,協議服務器端安裝虛擬的WDDM顯示驅動,直接獲取圖形緩衝區中的數據並傳輸到客戶端進行重新渲染顯示。如下圖所示,中間的WDDM是系統提供的編程框架,我們基於這個框架,編寫裡面的小端口驅動,也就是顯示驅動。

虛擬化之——視頻重定向技術

基於WDDM驅動的視頻重定向技術原理主要是通過截獲D3D Runtime對WDDM驅動中的函數的調用情況,也就是協議服務器端通過從虛擬XPDM/WDDM顯示驅動中獲取到的圖形數據,然後在協議客戶端上重新執行復現。如果直接發送到協議客戶端,其數據量也是非常大的,所以為了有效捕獲傳輸的視頻數據,廠家一般都會開發一個WDDM驅動。在WDDM驅動有一類函數用於向上層提供多媒體編碼&解碼功能,這類函數總體稱為視頻硬件加速技術(即:DirectX VideoAcceleration,也就是DXVA)。同時還需要加入許多優化處理,減少傳輸數據,通常的優化手段有:

數據壓縮:利用各種圖像壓縮算法對圖像內容進行有損或者無損的壓縮來降低帶寬。

指令合併:圖形指令的數量有時候會非常之多,通過合併技術可以顯著降低指令數量與總體數據量。

數據緩存:通過緩存技術減少服務器與客戶端之間的冗餘數據交互。當然各個廠商採用的優化技術可能會有不同,且有些廠商優化手段更多,通過多種類型的優化手段組合處理,可以將網絡帶寬降低兩個數量級或以上。

在實際的使用過程中,基於WDDM的視頻重定向技術對H.264編碼的視頻文件有較好的支持,而對於Megp2和VC1編碼的文件支持就一般,主要原因是Megp2編碼過程跟標準編碼過程不同,因此會導致編碼過程異常,從而出現花屏的現象。其次播放器自身也存在差異行,如:射手影音本身就對VC1不支持,根本就無法調動硬解碼。

根據上面的說明,三種視頻重定向技術其實各有利弊。但基於WDDM驅動的視頻重定向技術在帶寬需求、對第三方播放器的支持以及對系統更新的敏感度上都是這幾種技術實現中相對較好,技術實現的難度也是最大的。


分享到:


相關文章: