产品百科 |零门槛玩转 RTC Unity Demo-阿里云开发者社区

开发者社区> 阿里云视频云> 正文
登录阅读全文

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

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

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

前提条件

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

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

创建 Unity 项目

  1. 打开 Unity,单击新建
  2. 输入项目名称、项目保存位置,并选择 3D 模版。
  3. 单击创建image.png

集成 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。image.png
  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。image.png
  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 字符串。image.png
  • iOS 平台:设置 Graphics APIs 为 OpenGLES2,去掉多线程渲染 Multithreaded Rendering。
    image.pngimage.pngiOS 导出为 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。
    image.pngimage.png
    说明 默认 Android 打包 ARMv7 版本,如果打包 ARM64 版本,需要选中 Target Architectures 中 ARM64 选项。
    选中该 Export Project 后导出目录需要有子级文件夹,例如可导出在以下目录:Aliyun/UnityRTC。image.png
  • Windows 平台:Windows 应用导出前,切换到 PC Platform,选择 Player Settings,在 Player 的 Scripting Backend 选项选中 Mono。

image.png


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

image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

分享视频云行业和技术趋势,打造“新内容”、“新交互”。

官方博客
官网链接