一、背景知识
1、RTP协议
有些Citrix的技术文章提到了RTP协议,引用网上对RTP的解释:“RTP只是一个协议框架,它只包含了实时应用的一些共用功能,RTP自己并不对多媒体数据块做任何处理,而只是向应用层提供一些附加信息,让应用层知道应当如何进行处理”。
在Citrix技术文章中我们会看到Audio over RTP和Audio over UDP这样的术语,可以认为这两个术语是等同的关系。如果Citrix云桌面通过UDP传输音频 (并非EDT),RTP协议会被使用。有时我们需要调节RTP的音频数据缓冲区(Jitter Buffer)来适应网络抖动情况。
2、云桌面的音频传输协议
在CVAD 2203 LTSR发布之前,Citrix云桌面与客户端之间传输音频数据,有三种传输协议:Audio over UDP/Audio over RTP、EDT和ICA TCP。在容忍网络拥塞和丢包、提供更好音频质量的角度,Citrix研发建议优先启用Audio over UDP,然后才是EDT,最后是ICA TCP:
Audio over UDP 》》EDT 》》ICA TCP
3、音频质量
配置过Citrix Studio音频相关策略的你,应该知道1912 LTSR的音频质量分为以下几档:
高质量:比特率约100kbps,采样频率44100 Hz
中质量:比特率约16kbps,采样频率16000Hz
低质量:比特率约11kbps,采样频率8000Hz
当我们把音频质量设为“中”,云桌面使用的音频编码器是speex;当我们把音频质量设为“高”,云桌面使用的音频编码器是Vorbis。我们可以通过修改VDA的注册表,手工调节speex和Vorbis两种编码的音频质量。
二、CWA客户端版本的选择
无论从功能、性能还是售后支持的角度,我们都建议客户端安装最新的LTSR或CR版本。尤其考虑到售后支持的因素:假如在生产部署中我们发现了Citrix Workspace App客户端的产品缺陷,Citrix产品组只会在CWA最新的LTSR或CR版本上修复缺陷。
因此,如果在生产部署中我们怀疑问题和CWA版本有关,可以在最新的LTSR或CR版本上测试问题是否发生。年初有家用户偶发遇到云桌面无声音、声音质量不佳、插拔耳麦会话无响应等问题,自从把CWA版本从1912 LTSR CU3升级到当时最新的CU7,Helpdesk接到的音频问题大大减少。
截止到写文章时,Windows客户端最新的CR版本是2205,LTSR版本是2203.1
(注:由于CWA 2203 LTSR已发布,CWA 1912 LTSR在今年3月23日开始EOM,即不再发布补丁)
若客户端是Linux CWA,并且通过Citrix Gateway连接云桌面,如果希望启用Audio over UDP,需要Linux CWA 2202或更高版本。
三、音频效果优化(Audio over UDP)
对于没有基于Citrix做过VoIP流量优化的一般软件而言,Citrix官方建议是Audio over UDP的效果要优于EDT和ICA TCP。在网络延迟和抖动情况不理想的客户端网络环境中,Audio over UDP协议能提供更稳定的音频效果。
Audio over UDP如果启用,音频流会从常规的ICA TCP流量中剥离出来,通过UDP/RTP单独承载。Audio over UDP的成功运行,依赖以下环节都配置到位:
VDA、HDX策略、客户端、Citrix Gateway、防火墙端口策略
1)VDA的UDP支持
安装VDA时切记勾上实时音频传输的选项,并配置Windows防火墙自动创建规则放行UDP端口:
2)HDX策略
Citrix Studio中确认以下四条策略的设置:
“通过UDP协议的音频实时传输”:启用
“音频质量”:中 - 语音优化
“通过UDP协议的音频”:允许 (仅限于多会话VDA)
“音频UDP端口范围”:保持默认值不变
其中第二条策略的缺省值是“高-高清晰度音频”,而音频质量为高时,使用的是Vorbis编码,与音频质量为中时使用的Speex编码不同。目前Audio over UDP只支持Speex编码和音频质量设为中。这个设置往往会被用户忽略。
此外,由于EDT协议也会用到UDP传输,为了避免对Audio over UDP产生干扰,或抢占Citrix ADC的DTLS通道,Citrix Studio中将HDX自适应传输关闭:
3)客户端
- a)加入AD域的终端
通过AD组策略推送如下设置 (需要先导入icaclient.adm管理模板):
- b)未加入AD域的终端
如果是Windows终端:
将icaclient.adm导入本地策略,再做a) 的设置;
-或者-
修改StoreFront的ICA文件模板 (C:\inetpub\wwwroot\Citrix\<Store Name>\App_Data\default.ica)
注:如果修改了default.ica模板,那么连接这个store的所有用户的音频设置都会受影响。
如果是Linux终端,同时不希望修改storefront的default.ica,可以在终端本地的module.ini中修改:
[ClientAudio]
EnableUDPAudio=true
UDPAudioPortLow=16500
UDPAudioPortHigh=16509
[WFClient]
EnableUDPThroughGateway=True
注1:default.ica的设置优先级比终端本地module.ini更高,即会覆盖module.ini的设置。
注2:上面提到的EnableUDPThroughGateway开关,需要Linux CWA 2202或更高版本,因为通过Citrix Gateway的DTLS封装Audio over UDP,是从Linux CWA 2202开始支持的。详见 https://docs.citrix.com/en-us/citrix-workspace-app-for-linux/configure-xenapp.html的“Enabling UDP Audio”一节。
4)Citrix Gateway
如果用户终端是通过Citrix Gateway连接云桌面,音频流量需要封装进DTLS协议传输,因此在Citrix Gateway的VPN Virtual Server上需要将DTLS选项启用:
如果使用的Citrix ADC还是老版本,如10.5e,勾选DTLS选项后需要先把VPN Virtual Server上的SSL证书解绑,再重新绑定证书:
https://www.citrix.com/blogs/2015/04/03/udp-audio-through-a-netscaler-gateway/
主流版本的Citrix ADC不需要解绑和重新绑定证书的操作。
从Citrix Gateway 13.0 build 64.x开始,还可以配置专门的DTLS VPN Virtual Service,实现更高的安全性,如高级的DTLS加密算法:
https://docs.citrix.com/en-us/citrix-gateway/current-release/configure-dtls-virtual-server-using-ssl-virtual-server.html
为了将音频流量封装进DTLS协议,需要在citrix studio将会话可靠性策略启用:
5)防火墙端口策略
除了客户端和Citrix Gateway连接VDA的常规网络端口外,Audio over UDP需要放行以下的额外端口:
- a)客户端直连Storefront
源 | 目标 | 传输协议 | 端口 | 用途 |
终端设备 | VDA | UDP | 16500~16509 | 实时音频 |
- b)客户端通过Citrix Gateway连接
源 | 目标 | 传输协议 | 端口 | 用途 |
Gateway SNIP | VDA | UDP | 16500~16509 | 实时音频 |
终端设备 | Gateway VIP | UDP | 443 | DTLS |
6)确认Audio over UDP正常工作
- 都正确配置后,在VDA端运行HDX Monitor,音频通道的“UDP音频传输”应为“活动“,以下截图说明Audio over UDP未启用 (从音频压缩算法是Vorbis可以推断音频质量被设为了高):
- 还可以在音频通道中查看WMI属性,Component_RTP_Enabled和Component_RTP_InUse都应为True。以下截图来自同一个例子,Audio over UDP未启用:
- 注:如果在Citrix Director的会话详细信息里看到协议为UDP,并不意味着Audio over UDP已成功启用。这里的协议显示为UDP是由于EDT启用成功了,音频流被封装在EDT协议中,并未单独剥离出来,音频效果通常不如Audio over UDP。
- 四、其他音频效果优化(其他方法)
1)网络抖动缓冲
通过注册表,启用RTP协议数据包传输的缓冲(Jitter buffer),降低网络抖动对于RTP数据包传输稳定性的影响。
VDA | HKEY_LOCAL_MACHINE\(Wow6432Node)\SOFTWARE\Citrix\Audio RTPJitterBuffer (REG_DWORD) = 1 |
客户端 | HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\ICA Client\Engine\Configuration\Advanced\Modules\ClientAudio RTPJitterBuffer (REG_DWORD) = 1 |
2)降噪处理
通过注册表,启用speex音频编码的降噪处理 (speex是音频质量设为中的编码方式):
VDA | HKEY_LOCAL_MACHINE\(Wow6432Node)\SOFTWARE\Citrix\Audio EnableDenoise (REG_DWORD) = 2 |
客户端 | HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\ICA Client\Engine\Configuration\Advanced\Modules\ClientAudio EnableDenoise (REG_DWORD) = 2 |
注:很多使用VoIP的即时通讯和在线会议软件,都自带了降噪功能,如Teams的噪声抑制选项等等。
3)回声抑制
通过注册表,启用客户端的回声抑制功能:
客户端 | HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\ICA Client\Engine\Configuration\Advanced\Modules\ClientAudio EchoCancellation (REG_SZ) = True |
注1:如果使用1912 CU3之前的CWA版本,在音频质量策略设为中的情况下,EchoCancellation注册表会造成wfica32.exe进程异常退出,导致会话断开。此Bug在CWA 1912 CU3得到修复 [CVADHELP-14568]
注2:除了通过注册表激活软件的回声抑制,Citrix也建议用户选择自带硬件回声抑制(AEC)功能的耳麦。硬件的回声抑制效果,通常要比软件的抑制效果更彻底。
4)提高Citrix Audio Redirection Service的资源优先级
VDA中的Citrix Audio Redirection Service负责管理音频虚拟通道(CTXCAM)。对于独享桌面,可以通过Windows任务管理器、WEM或第三方桌面管理软件将Citrix Audio Redirection Service的资源优先级设为高。在一些项目中,这个调整可以消除语音断断续续的现象:
注:如果是基于多会话的共享桌面或虚拟应用,Citrix Audio Redirection Service与其余多个服务共享使用通用的虚拟通道服务CtxSvcHost.exe,而不是单独的进程名。可以先找到对应的CtxSvcHost.exe进程,再手动提升资源优先级。
5)调节UDP读取频率
通过注册表,调节客户端发送UDP读请求之前等待的时长,根据环境中不同的效果可以分别把值改为10/15/20/25/30进行测试:
客户端 | HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\ICA Client\Engine\Configuration\Advanced\Modules\ClientAudio UDPCapturePeriod (REG_SZ) = 10 ~ 30 |
6)调节音频的最大比特率
比特率(BitRate)即每秒传送的比特(bit)数。比特率越高,每秒传输的音频数据就越多,音质就越清晰。前面提到音频质量设为中或高时,音频编码分别为speex和vorbis,可以通过修改VDA的注册表,调节这两种编码的最大比特率:
音频质量:中 | HKLM\SOFTWARE\Citrix\Audio MaxSpeexQuality (REG_DWORD) Value: 0 to 10 (default is 5) |
音频质量:高 | HKLM\SOFTWARE\Citrix\Audio MaxVorbisQuality (REG_DWORD) Value: 0 to 10 (default is 2) |
不同键值的比特率如下:
注:比特率越大,消耗的流量带宽越高。
五、常见问题处理
- 1) 云桌面无声(输入或输出)
- a)先验证客户端本地的声音输入或输出是否正常,可以在Windows终端的控制面板中进入声音设置,测试声音的输入和输出。
- b)如果用户外接了显示器,系统可能将显示器选为了默认的声音输出设备。
- c)Windows终端的麦克风隐私设置
麦克风隐私设置可能不允许Citrix HDX Engine应用访问麦克风。在控制面板中检查。
- d)如果终端本地的声音输入和输出正常,但云桌面中无法试用麦克风,先检查CWA的麦克风和网络摄像机是否设成了自动连接:
- e)在云桌面的控制面板中测试声音的输入和输出设备
- f)云桌面中打开services.msc,检查Citrix Audio Redirection Service是否正常运行,若此服务已停止,手动启动服务,再断开会话重连。
- 2)插拔耳机 或耳麦导致云桌面窗口无响应
有用户发现拔掉耳机并重连,云桌面仍保留着之前的耳机设备;有用户发现从第一个终端断开会话再用另一终端重连会话后,云桌面内音频设备的排列顺序不正确了。这其实是从XenDesktop 5.x时代遗留下来的问题 [LC9440],可以通过修改VDA的注册表,在会话断开时强制清除音频设备映射:
VDA | HKLM\SOFTWARE\Citrix\Audio CleanMappingWhenDisconnect (REG_DWORD) = 1 |
- 3)Remote PC的音频设备自动被禁用
用RemotePC发布物理机,无声。点击云桌面右下角的系统托盘打开声音属性,看到扬声器或麦克风被自动禁用了:
可能原因1
给物理机通过命令行安装VDA时,少加了/remotepc参数。解决办法是用命令行重装VDA并加上/remotepc参数,例如:
VDAWorkstationSetup.exe /controllers "xxxxxxx.lab" /quiet /components VDA /disableexperiencemetrics /enable_hdx_ports /enable_hdx_udp_ports /enable_real_time_transport /enable_remote_assistance /remotepc /exclude "Machine Identity Service","Citrix Personalization for App-V - VDA","Citrix Supportability Tools","Citrix Files for Windows","Citrix Files for Outlook","User personalization layer","Citrix WEM Agent","Citrix MCS IODriver","Citrix VDA Upgrade Agent","Citrix Rendezvous V2" /includeadditional "Citrix Profile Management","Citrix Profile Management WMI Plugin"
可能原因2
如果更换其他的VDA版本(如VDA 1912)后,音频设备不会被自动禁用,那很可能是VDA 2203的一个已知问题(CVADHELP-20164)。此问题目前已有临时补丁,可联系Citrix原厂SE或给Citrix Tech Support开CASE获取此临时补丁验证问题。