多媒体视频播放对虚拟桌面是一个巨大的挑战,视频播放涉及用户体验、音频视频同步、带宽等多种考虑因素。
正常的视频播放过程,一般是将视频文件读取后,经过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版本。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驱动的视频重定向技术在带宽需求、对第三方播放器的支持以及对系统更新的敏感度上都是这几种技术实现中相对较好,技术实现的难度也是最大的。