本章节为您介绍了 Unity Demo 的集成操作步骤。
前提条件
您需要开通阿里云 RTC 服务并在控制台成功创建应用,具体操作请参见入门概述。
获取 Token,详情请参见服务端生成 Token。
创建 Unity 项目
- 打开 Unity,单击新建。
- 输入项目名称、项目保存位置,并选择 3D 模版。
- 单击创建。
集成 SDK
- 下载 Unity SDK。解压后包含 sample 和 sdk 两个目录,sample 目录为 Unity 对接工程,sdk 目录为 Unity 版本 SDK。
- 在项目 Assets 目录下新建 Plugins 目录。
- 复制 SDK 中以下目录文件到项目 Plugins 目录。
平台 | 文件或文件夹 | 项目路径 |
Android | /Android/AliRtcCwrapper.aar | /Assets/Plugins/Android |
/Android/AliRTCSdk.jar | /Assets/Plugins/Android | |
/Android/alivc-core-rtc.aar | /Assets/Plugins/Android | |
/Android/Sophonsdk.aar | /Assets/Plugins/Android | |
/Android/utdid4all-1.5.0-proguard.jar | /Assets/Plugins/Android | |
/Android/webrtclib.aar | /Assets/Plugins/Android | |
iOS | /iOS/AliRTCSdk.framework | /Assets/Plugins/iOS |
/iOS/libAliRTCSdkCInterface.a | /Assets/Plugins/iOS | |
macOS | /macOS/AliRTCSdkCWrapper.bundle | /Assets/Plugins/macOS |
Windows | /x86/AliRTCSdk.dll | /Assets/Plugins/x86 |
/x86/AliRTCSdkCWrapper.dll | /Assets/Plugins/x86 | |
/x64/AliRTCSdk.dll | /Assets/Plugins/x64 | |
/x64/AliRTCSdkCWrapper.dll | /Assets/Plugins/x64 |
- 在项目 Assets 目录下新建 Scripts 目录。
- 复制 SDK 中以下目录文件到项目 Scripts 目录。
文件 | 项目路径 |
/Scripts/AliRtcEngine.cs | /Assets/Scripts |
/Scripts/IAliRtcEngineBase.cs | /Assets/Scripts |
/Scripts/VideoDisplaySurface.cs | /Assets/Scripts |
实现音视频通话功能
- 添加 UI 控制。您可以创建用户界面,以 Unity Sample 为例,创建本地视频窗口 GameObject(LocalVideoCube)和远端视频窗口 GameObject(RemoteVideoCube),以及控制按钮 ControlButton。
- UI 界面保存到 /Assets/Scenes/SampleScene.unity。
- 创建控制音视频通信功能的 Home.cs 文件,并将该文件添加到主 Main Camera,使得 Home.cs 文件在 Main Camera 启动时就被加载。
- 获取权限(仅 Android 操作)。在 UNITY_2018_3_OR_NEWER 及以上版本,Android 设备需要在 Unity 中设置主动向用户获取麦克风和相机权限,需要调用 CheckPermission 主动获取权限。
private ArrayList permissionList = new ArrayList(); void Start () { #if (UNITY_2018_3_OR_NEWER && UNITY_ANDROID) permissionList.Add(Permission.Microphone); permissionList.Add(Permission.Camera); #endif } void Update () { #if (UNITY_2018_3_OR_NEWER && UNITY_ANDROID) CheckPermission(); #endif } private void CheckPermission() { #if (UNITY_2018_3_OR_NEWER && UNITY_ANDROID) foreach (string permission in permissionList) { if (Permission.HasUserAuthorizedPermission(permission)) { } else { Permission.RequestUserPermission(permission); } } #endif }
- 此外,集成 Android 平台时,需要 AndroidManifest.xml 文件和 project.properties 文件来管理项目权限和项目属性,可以直接拷贝 AliRTCSdkEngine.plugin 目录到 / Assets/Plugins/Android。
- 初始化 IAliRtcEngine。执行创建 IAliRtcEngine,根据需要注册侦听通知回调,设置自动推流订阅模式。
string extra = ""; IAliRtcEngine mRtcEngine = IAliRtcEngine.GetEngine (extra); mRtcEngine.OnJoinChannelNotify = onJoinChannelNotify; mRtcEngine.OnPublishNotify = onPublishNotify; mRtcEngine.OnSubscribeNotify = onSubscribeNotify; mRtcEngine.OnRemoteUserOnLineNotify = onRemoteUserOnLineNotify; mRtcEngine.OnRemoteUserOffLineNotify = onRemoteUserOffLineNotify; mRtcEngine.OnRemoteTrackAvailableNotify = onRemoteTrackAvailableNotify; mRtcEngine.OnSubscribeChangedNotify = onSubscribeChangedNotify; mRtcEngine.OnLeaveChannelResultNotify = onLeaveChannelResultNotify; mRtcEngine.SetAutoPublish(true, true);
- 打开本地预览。进入频道前需要启动本地视频采集预览显示,获取 UI 中 VideoCube 对象,添加 VideoDisplaySurface 到 VideoCube 上。说明VideoDisplaySurface 是 SDK 封装用于视频渲染的 C# 类,任何 Unity 中 GameObject 物体上需要显示视频内容,必须要绑定 VideoDisplaySurface。VideoDisplaySurface 主要有以下三个功能:
- void SetUserId (string uid):设置渲染视频的用户 ID,本地 uid 填空字符串
""
。 - void SetVideoTrack (AliRTCVideoTrack track):设置视频流类型,有 camera(相机流)和 screen(共享流)两种,用于区分同一用户 ID 推送的两种不同的是视频流。
- void SetEnable (bool enable):控制视频是否显示。
- void SetUserId (string uid):设置渲染视频的用户 ID,本地 uid 填空字符串
- 添加 surface 后,调用 IAliRtcEngine 接口设置本地预览和开启预览。
GameObject go = GameObject.Find("LocalVideoCube"); VideoDisplaySurface surface = go.GetComponent<VideoDisplaySurface>(); surface.SetUserId(""); surface.SetVideoTrack(AliRTCVideoTrack.VIDEO_TRACK_CAMERA); surface.SetEnable(true); mRtcEngine.SetLocalViewConfig(true); mRtcEngine.ConfigExternalVideoRendering(true); mRtcEngine.StartPreview();
- 获取频道鉴权信息。该步骤主要通过和 AppServer 进行通信,获取进入的频道名称以及对应的鉴权信息,成功获取到的信息需要保存在 AliRTCAuthInfo 结构中。
- 加入频道。成功获取到入会鉴权信息后,通过调用接口 JoinChannel 加入频道,需要传递参数有 AliRTCAuthInfo 和用户名称。调用加入频道接口后,SDK 会通过 OnJoinChannelNotify 通知回调是否入会成功,参数 errorCode 为 0 表示入会成功,其他表示失败。
mRtcEngine.JoinChannel(authInfo, "userName"); private void onJoinChannelNotify (int errorCode) { if (errorCode == 0) { Debug.Log("加入频道成功"); } else { Debug.Log("加入频道失败"); } }
- 远端用户视频显示。订阅远端用户的音视频流相关的回调是 onSubscribeChangedNotify,控制远端用户视频的显示在该回调中实现。onSubscribeChangedNotify 有三个参数:
- userId 表示远端用户 ID。
- audioTrack 有 mic(麦克风)和 none 两种类型,none 表示当前没有远端音频流。
- videoTrack 有 camera、screen、both 和 none 四种类型,分别表示该用户的视频流状态,both 表示同时订阅远端用户的 camera(相机流)和 screen(共享流),none 表示当前没有远端视频流。
- 在回调中,检查参数 videoTrack 是否为 camera、screen、both 三者中的一种,如果是需要使用 GameObject 对象进行显示,并添加 VideoDisplaySurface,如果 videoTrack 为 none,需要控制 GameObject 对象取消显示。
private void onSubscribeChangedNotify (string userId, int audioTrack, int videoTrack) { if (videoTrack == (int)AliRTCVideoTrack.VIDEO_TRACK_CAMERA) { GameObject go = GameObject.Find("RemoteVideoCube"); if (!ReferenceEquals(go, null)) { VideoDisplaySurface surface = go.GetComponent<VideoDisplaySurface>(); surface.SetUserId(userId); surface.SetVideoTrack(AliRTCVideoTrack.VIDEO_TRACK_CAMERA); surface.SetEnable(true); } } else if (videoTrack == (int)AliRTCVideoTrack.VIDEO_TRACK_NONE) { GameObject go = GameObject.Find("RemoteVideoCube"); if (!ReferenceEquals(go, null)) { VideoDisplaySurface surface = go.GetComponent<VideoDisplaySurface>(); surface.SetEnable(false); } } }
- 离开频道。结束音视频通话时调用接口 LeaveChannel 离开频道,离开频道前需要关闭本地预览以及移除远端视频显示。
mRtcEngine.StopPreview(); GameObject go = GameObject.Find("LocalVideoCube"); VideoDisplaySurface surface = go.GetComponent<VideoDisplaySurface>(); surface.SetEnable(false); go = GameObject.Find("RemoteVideoCube"); surface = go.GetComponent<VideoDisplaySurface>(); surface.SetEnable(false); mRtcEngine.LeaveChannel();
- 销毁 IAliRtcEngine。调用 IAliRtcEngine 的 Destroy 方法退出 App 或者释放内存。
Unity Editor 中调试
Unity Editor 中调试只需要确保放入 macOS 或 Windows 所需的文件或文件夹到 /Assets/Plugins 目录即可。
工程导出设置
- Mac 平台:Unity 编译导出 Mac 平台应用,macOS10.15 以下版本无需做额外设置,只需选中 Target Platform 为 Mac OS, 勾上 Development Build 即可;macOS10.15 及以上版本需要选择 Player Settings,在 Player 的 Other Settings 选项中,将 Camera Usage Description 文本框中添加 open camera 字符串,Microphone Usage Description 文本框中添加 open microphone 字符串。
- iOS 平台:设置 Graphics APIs 为 OpenGLES2,去掉多线程渲染 Multithreaded Rendering。
iOS 导出为 xcode 工程,在 xcode 工程中需要先关闭 bitcode,在 info.plist 文件中添加麦克风和相机访问,并且在 Embed Framework 中添加 AliRTCSdk.framework,开启 background 模式,以上设置也可以在 Unity 打包后处理脚本中添加导出的工程设置。 - Android 平台:Android 应用导出前,切换到 Android Platform,选择 Player Settings,在 Player 的 Other Settings 选项中,设置 Graphics APIS 为 OpenGLES2,去掉多线程渲染 Multithreaded Rendering,Scripting Backend 选择 IL2CPP。
说明 默认 Android 打包 ARMv7 版本,如果打包 ARM64 版本,需要选中 Target Architectures 中 ARM64 选项。
选中该 Export Project 后导出目录需要有子级文件夹,例如可导出在以下目录:Aliyun/UnityRTC。 - Windows 平台:Windows 应用导出前,切换到 PC Platform,选择 Player Settings,在 Player 的 Scripting Backend 选项选中 Mono。
「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。