多媒体视频播放对虚拟桌面是一个巨大的挑战,视频播放涉及用户体验、音频视频同步、带宽等多种考虑因素。通常是读取视频文件,然后通过CPU将其解码为图像的典型视频播放过程。虚拟机的图像数据必须通过网络发送给客户端进行渲染。另一方面,视频解码过程在服务器端CPU压力越来越大,解码的图像数据流量非常大,受网络带宽的限制,最终导致客户端出现的画面质量下降,视频播放不顺畅。

目前,桌面虚拟化产品支持多媒体视频回放。通常有两种方法。一种是将服务器端的多媒体视频播放图像重新进行视频编码处理,然后将视频编码数据发送到客户端进行解码播放显示。另一种视频重定向方法是捕捉需要在服务器端播放器上播放的视频编码流,并将视频编码流直接发送到客户端进行解码播放显示。我们通常称之为视频重定向技术。使用客户端本地视频重定向技术,可以通过系统插件将视频解码前的数据直接传输到客户端,使用客户端的CPU/GPU进行解码,从而实现视频文件的高清播放。这可以解决服务器端视频播放消耗的服务器性能,同时解决网络流量大导致视频播放不顺畅的问题。

根据上面的技术结构图,一开始视频重定向方式效率很高,服务器端的视频解码和重新编码资源消耗也很少,但实际上有很多限制,没有广泛的兼容性。具体原因如下。

第一种方法是虚拟机的播放器解码视频,因此解码CPU资源消耗更大,视频区域可以重新编码,从而增加CPU消耗,从而降低服务器上虚拟机的密度。(威廉莎士比亚、Northern Exposure(美国电视剧)、Northern Exposure(美国电视)、计算机名言)视频区域的动态识别也是一个重要的技术点,通常根据刷新频率超过特定帧速率的图像更改区域来识别。

第二种方法是,只有要解码的视频代码流被服务器端拦截,并直接发送到客户端进行解码,因此服务器端的开销较小。这是目前比较流行的技术,国内很多企业基本上都是针对Windows Media Player的视频重定向技术,但在国内实用性不高。因为国内用户很少使用Windows Media Player播放器,所以第二种方式的应用场景实际上是有限的。当然,技术也在发展,能够支持其他玩家的多媒体重定向技术的后续也在继续。例如风暴视频重定向、QQ音频视频重定向等。

视频重定向的三种实现技术:

视频重定向所需的功能是视频文件存储在服务器上的虚拟桌面上,用户使用客户端远程连接到服务器上的虚拟桌面,然后在虚拟桌面上运行播放器来播放视频文件。通过以下三种实现技术之一,可以在客户端平滑地显示在虚拟桌面上播放的视频文件,使用户能够在客户端上远程查看虚拟桌面的视频资源。

重定向视频的三种技术是

1、基于播放器的视频重定向。

该技术是指在客户端和客户端分别实现播放器,分析服务器上视频文件的组织方式,然后将未解码的视频数据传输到客户端的播放器。客户端播放器解码播放视频数据。

基于播放器的视频重定向技术设计不需要高带宽。但是这个想法应该限制用户使用特定的播放器。在许多国内场景中,选择的这种方法可以在客户端安装或自定义特殊播放器,以获取虚拟机传输的视频数据。

2、基于钩子技术的视频重定向。

技术原理:

挂接(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版本。Window(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驱动的视频重定向技术在带宽需求、对第三方播放器的支持以及对系统更新的敏感度上都是这几种技术实现中相对较好,技术实现的难度也是最大的。