产品百科 |零门槛玩转 RTC Unity Demo

本章节为您介绍了 Unity Demo 的集成操作步骤。

前提条件

您需要开通阿里云 RTC 服务并在控制台成功创建应用,具体操作请参见入门概述

获取 Token,详情请参见服务端生成 Token

创建 Unity 项目

  1. 打开 Unity,单击新建
  2. 输入项目名称、项目保存位置,并选择 3D 模版。
  3. 单击创建产品百科 |零门槛玩转 RTC Unity Demo

集成 SDK

  1. 下载 Unity SDK。解压后包含 sample 和 sdk 两个目录,sample 目录为 Unity 对接工程,sdk 目录为 Unity 版本 SDK。
  2. 在项目 Assets 目录下新建 Plugins 目录。
  3. 复制 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

  1. 在项目 Assets 目录下新建 Scripts 目录。
  2. 复制 SDK 中以下目录文件到项目 Scripts 目录。
文件 项目路径
/Scripts/AliRtcEngine.cs /Assets/Scripts
/Scripts/IAliRtcEngineBase.cs /Assets/Scripts
/Scripts/VideoDisplaySurface.cs /Assets/Scripts

实现音视频通话功能

  1. 添加 UI 控制。您可以创建用户界面,以 Unity Sample 为例,创建本地视频窗口 GameObject(LocalVideoCube)和远端视频窗口 GameObject(RemoteVideoCube),以及控制按钮 ControlButton。产品百科 |零门槛玩转 RTC Unity Demo
  2. UI 界面保存到 /Assets/Scenes/SampleScene.unity。
  3. 创建控制音视频通信功能的 Home.cs 文件,并将该文件添加到主 Main Camera,使得 Home.cs 文件在 Main Camera 启动时就被加载。
  4. 获取权限(仅 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
}
  1. 此外,集成 Android 平台时,需要 AndroidManifest.xml 文件和 project.properties 文件来管理项目权限和项目属性,可以直接拷贝 AliRTCSdkEngine.plugin 目录到 / Assets/Plugins/Android。产品百科 |零门槛玩转 RTC Unity Demo
  2. 初始化 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);
  1. 打开本地预览。进入频道前需要启动本地视频采集预览显示,获取 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):控制视频是否显示。
  1. 添加 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();
  1. 获取频道鉴权信息。该步骤主要通过和 AppServer 进行通信,获取进入的频道名称以及对应的鉴权信息,成功获取到的信息需要保存在 AliRTCAuthInfo 结构中。
  2. 加入频道。成功获取到入会鉴权信息后,通过调用接口 JoinChannel 加入频道,需要传递参数有 AliRTCAuthInfo 和用户名称。调用加入频道接口后,SDK 会通过 OnJoinChannelNotify 通知回调是否入会成功,参数 errorCode 为 0 表示入会成功,其他表示失败。
mRtcEngine.JoinChannel(authInfo, "userName");
private void onJoinChannelNotify (int errorCode)
{
    if (errorCode == 0)
    {
        Debug.Log("加入频道成功");
    }
    else
    {
        Debug.Log("加入频道失败");
    }
}
  1. 远端用户视频显示。订阅远端用户的音视频流相关的回调是 onSubscribeChangedNotify,控制远端用户视频的显示在该回调中实现。onSubscribeChangedNotify 有三个参数:
    • userId 表示远端用户 ID。
    • audioTrack 有 mic(麦克风)和 none 两种类型,none 表示当前没有远端音频流。
    • videoTrack 有 camera、screen、both 和 none 四种类型,分别表示该用户的视频流状态,both 表示同时订阅远端用户的 camera(相机流)和 screen(共享流),none 表示当前没有远端视频流。
  1. 在回调中,检查参数 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);
        }
    }
}
  1. 离开频道。结束音视频通话时调用接口 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();
  1. 销毁 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 字符串。产品百科 |零门槛玩转 RTC Unity Demo
  • iOS 平台:设置 Graphics APIs 为 OpenGLES2,去掉多线程渲染 Multithreaded Rendering。
    产品百科 |零门槛玩转 RTC Unity Demo产品百科 |零门槛玩转 RTC Unity DemoiOS 导出为 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。
    产品百科 |零门槛玩转 RTC Unity Demo产品百科 |零门槛玩转 RTC Unity Demo
    说明 默认 Android 打包 ARMv7 版本,如果打包 ARM64 版本,需要选中 Target Architectures 中 ARM64 选项。
    选中该 Export Project 后导出目录需要有子级文件夹,例如可导出在以下目录:Aliyun/UnityRTC。产品百科 |零门槛玩转 RTC Unity Demo
  • Windows 平台:Windows 应用导出前,切换到 PC Platform,选择 Player Settings,在 Player 的 Scripting Backend 选项选中 Mono。

产品百科 |零门槛玩转 RTC Unity Demo


「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

产品百科 |零门槛玩转 RTC Unity Demo

上一篇:我在春晚现场护航直播


下一篇:产品百科 | RTC Android SDK 如何在通话前进行网络测速