Hololens2背景移除及视频通话系统搭建技术问询
问题解答
一、Hololens2 屏蔽现实背景(设置黑色背景)
方法1:Unity渲染全屏黑色层
- 创建一个Quad平面,缩放至覆盖相机视野,设置颜色为纯黑,将其
Layer设为Ignore Raycast避免交互冲突。 - 将该平面材质的
Render Queue设为1000,确保它在渲染队列中优先级最高,始终显示在现实画面之上。
方法2:调用Hololens系统API切换不透明模式
- 使用UWP原生API直接将设备切换为不透明显示模式,现实背景会自动变为黑色,代码示例:
using Windows.Graphics.Holographic; using UnityEngine.XR.WSA; public class EnableOpaqueMode : MonoBehaviour { void Start() { var defaultDisplay = HolographicDisplay.GetDefault(); if (defaultDisplay != null) { defaultDisplay.IsOpaque = true; } } }
- 需在UWP包清单中添加
holographic权限,部署应用时确保权限启用。
二、Hololens2 视频通话可行方案
方案1:MRTK2 + WebRTC
- 导入MRTK2官方适配的
Microsoft.MixedReality.WebRTC扩展包(兼容Unity 2020.3版本)。 - 核心实现步骤:
- 初始化
PeerConnection,配置STUN服务器(如stun.l.google.com:19302)。 - 调用
AddLocalVideoTrackAsync()捕获Hololens2前置摄像头画面。 - 通过自定义信令服务(如WebSocket或Azure SignalR)交换SDP Offer/Answer与ICE候选。
- 将远程视频流绑定到Unity的
RawImage或3D平面完成渲染。
- 初始化
- 需在UWP包清单中开启
Webcam、Microphone、Internet (Client)权限。
方案2:Azure Communication Services (ACS)
- 作为Azure Spatial Calling的替代方案,稳定性与文档支持更完善:
- 在Azure门户创建ACS资源,获取连接字符串。
- 导入适配Unity 2020.3的ACS Unity SDK,通过连接字符串生成用户令牌。
- 初始化
CallClient与CallAgent,加入目标通话。 - 绑定本地/远程视频流到Unity的
VideoRenderer组件完成渲染。
- 关键代码片段(令牌生成与通话初始化):
using Azure.Communication.Calling.Unity; using System.Threading.Tasks; public class ACSVideoCall : MonoBehaviour { public string acsConnectionString; public string targetCallId; private CallAgent _callAgent; async void Start() { var callClient = new CallClient(); var token = await GenerateUserToken(acsConnectionString); _callAgent = await callClient.CreateCallAgentAsync(new CommunicationTokenCredential(token)); var call = await _callAgent.JoinAsync(new CallJoinOptions(targetCallId)); // 绑定本地视频 call.LocalVideoStreams.FirstOrDefault()?.SetRenderer(GetComponent<VideoRenderer>()); // 监听远程视频流 call.RemoteVideoStreamsUpdated += (s, e) => { foreach (var stream in e.AddedStreams) { stream.SetRenderer(GameObject.Find("RemoteVideoPanel").GetComponent<VideoRenderer>()); } }; } private async Task<string> GenerateUserToken(string connectionString) { var identityClient = new CommunicationIdentityClient(connectionString); var user = await identityClient.CreateUserAsync(); var tokenResponse = await identityClient.GetTokenAsync(user, new[] { CommunicationTokenScope.VoIP }); return tokenResponse.Token; } }
- 需在UWP包清单中开启对应权限,确保SDK版本与Unity 2020.3兼容。
内容的提问来源于stack exchange,提问作者심우성
相关产品推荐
相关产品推荐

