1.1.1  EA简介

The Remote Desktop Protocol: Audio OutputVirtual Channel Extension [MS-RDPEA]:

远程桌面协议:音频输出虚拟通道扩展。远程桌面协议无缝地传输音频数据从服务器到客户端。这个协议的目的是将音频数据从服务器传输到客户端。例如,当服务器播放音频文件时,这个协议将音频数据传输到客户端,客户端再播放音频文件。

1.1.2  EA相关内容

1、  音频重定向协议传输选项

远程桌面协议:音频输出虚拟通道扩展信息在客户端和服务器之间交互可以通过以下两种不同的传输方法:

Ø  静态虚拟通道(在【MS-RDPBCGR】文档中说明)

Ø  动态虚拟通道(在【MS-RDPEDYC】文档中说明

静态或者动态虚拟通道被用于服务器和客户端之间的数据传输和一些传输序列。对于某些特定的序列,尽管使用UDP也是一样的。但是本文档中,数据的传输在动态或者静态虚拟通道和UDP协议之间。

2、  音频重定向协议

远程桌面协议:音频输出虚拟通道扩展被分为三个不同的序列:

Ø  初始化序列

初始化序列有以下几个目的:

1、  建立客户端和服务器协议版本和功能

2、  建立一个客户端和服务器同时支持的音频格式列表,所有的音频数据传输格式制定在这个列表中。

3、  确定是否可以使用UDP传输音频数据(目前代码中传输未使用UDP模式)

最初,服务器发送一个ServerAudio Formats and Version PDU,制定其协议的版本和支持的音频格式给客户端。作为回应,客户端发送一个Client Audio Formats and Version protocol dataunit (PDU)。在这一点上,服务器和客户端拥有自己的版本,能力及一个支持音频格式的同步列表。如果客户端和服务器最低限度都是版本6,那么客户端在发送完Client Audio Formats and Version protocol data unit (PDU)后发送Quality Mode PDU。

如果客户端向接受数据通过UDP模式(Client Audio Formats and Version protocol dataunit (PDU) 协议包里面有个端口如果不为0,说明是客户端使用UDP模式)口,并试图使用UDP向这个端口发送一条Training PDU到客户端。这时客户端尝试回复自己的Training Confirm PDU。然后,服务器使用音频虚拟通道试图发送一个私有密钥(使用Crypt Key PDU)到客户端,这个密钥被用来加密数据通过UDP发送。如果前面所有的步骤成功,那么数据传输序列通过UDP发送。如果前面的步骤失败,数据传输序列都被送到虚拟通道。下图是初始化序列使用UDP发送数据。

Android音频透传_Android音频透传

图 2‑1 初始化序列使用UDP发送数据

如果所有的数据传输序列是在虚拟通道发送,服务器和客户端需要通过虚拟通道交互Training PDUTraining Confirm PDU信息。下图是初始化序列使用虚拟通道发送数据:

Android音频透传_RDPEA_02

图 2‑2 初始化序列使用虚拟通道发送数据

 

Ø  数据传输序列

数据传输序列的目的是传输音频数据从服务器到客户端。传输序列存在2个不同传输序列:一种传输协议通过虚拟通道,另外一个传输基于UDP。

1、  基于虚拟通道数据传输

基于虚拟通道数据传输序列是一个非常简单的协议。当客户端或者服务器的版本小于8时,服务器发送2个连续的音频数据包:WaveInfo

PDU Wave PDU。当客户端播放完数据,会发送Wave Confirm PDU通知服务器已经播放完毕。具体过程看下图:

Android音频透传_FREERDP_03

图2‑3 数据传输在虚拟通道使用WaveInfo PDU和Wave PDU

如何客户端和服务器的版本都大于8,这服务器发送Wave2 PDU到客户端。当消费完音频数据后,客户端回发Wave Confirm PDU到服务器,通知服务器已经播放完音频数据。具体流程图如下:

Android音频透传_FREERDP_04

图2‑4 基于虚拟通道数据传输使用Wave2 PDU

2、  基于UDP音频数据传输

基于UDP的数据传输稍微复杂点,和在虚拟通道中传输一样,服务器发送大量的音频数据到客户端,当客户端播放完音频数据后,客户端回发Wave Confirm PDU 到服务器。和基于虚拟通道传输不同之处就是服务如何发送音频数据。

    当如果客户端或服务器版本小于5,服务器发送音频数据使用Wave

Encrypt PDU。客户端播放完后,会回发Wave  ConfirmPDU到服务器。具体流程如下图:

Android音频透传_Android音频透传_05

图2‑5 基于UDP音频数据传输

如果客户端和服务器版本都大于5时,另一种方法可以发来发送基于UDP的音频数据。这种方法涉及到服务器发送连续的音频数据PDU。所有的PDU(除了最后一个)是UDP Wave PDUs。最后一个是UDP Wave Last PDU。获得这些PDU,客户端会重建音频数据样本。在播放完音频数据后,客户端会回发Wave Confirm PDU 到服务器。具体如下图:

Android音频透传_Android音频透传_06

图2‑6 基于UDP数据传输序列(协议版本大于5)

          最后:在初始化序列时,服务器会使用Crypt Key PDU发送一个32位的密钥,一些音频数据也使用该密钥。在音频数据传输结束后,这个服务器会通过虚拟通道发送给客户端Close PDU

 

Ø  音频设定传输序列

音频设定传输序列主要目的是发送来自服务器到客户端音频设定改变。2个不同的设定可能被重定向:音量和音调。所有的音频设定发送序列都通过虚拟通道发送。这设置被重定向使用Volume PDU and Pitch PDU