声网互动直播让你在 app 里轻松实现音视频直播功能,用户可以实时进行深入交流,创造更多商业机会。
本文介绍如何通过最简单的代码来集成声网视频 SDK,在你的 Unity 项目里实现高质量、低延时的音视频直播功能。
下图展示了利用声网视频 SDK 实现互动直播功能的工作流程。
参考以下步骤,在你的 app 中实现互动直播功能:
设置用户角色
在互动直播中,用户角色可分为主播和观众。主播可在频道中发流,观众可接收频道中的音视频流。
加入频道
调用 JoinChannel
方法来创建并加入频道。在 App ID 一致的前提下,传入相同频道名的用户会进入同一个频道。
在频道中发布并接收音视频流
加入频道后,主播可在频道中发流,并接收其他主播在频道中发布的音视频流。
在频道中接收音视频流
观众只能接收主播在频道中发布的音视频流,你可以调用 SetClientRole
将用户角色从观众切换为主播。
Unity 2017.4.35 或以上版本
操作系统与编译器要求:
开发平台 | 操作系统版本 | 编译器版本 |
---|---|---|
Android | Android 4.1 或以上 | Android Studio 3.0 或以上 |
iOS | iOS 9.0 或以上 | Xcode 9.0 或以上 |
macOS | macOS 10.10 或以上 | Xcode 9.0 或以上 |
Windows | Windows 7 或以上 | Microsoft Visual Studio 2017 或以上 |
有效的声网账户(免费注册)
计算机可以访问互联网。请确保你的网络环境未部署防火墙,否则可能无法正常使用声网服务。
一个有效的声网账号以及声网项目。请参考 开始使用声网平台 从声网控制台获得以下信息:
参考以下步骤或 Unity 官方操作指南创建一个 Unity 项目。若已有 Unity 项目,可以直接查看集成 SDK。
开始前确保你已安装 Unity。若未安装,点击此处下载。
打开 Unity,点击 New。
依次填入以下内容后,点击 Create project。
前往 SDK 下载页面,在视频 SDK 中下载最新版的 Unity SDK。
下载完成后在你的 Unity 编辑器中打开 SDK 包并取消勾选不需要的插件(默认会勾选 SDK 包含的所有插件),然后点击 Import。
本节介绍如何使用声网视频 SDK 在你的项目中实现视频直播功能。
为直观地体验视频直播,需根据应用场景创建用户界面(UI)。
如果你想实现一个视频直播,推荐在 UI 上添加以下控件:
参考以下步骤创建 UI。若你的项目中已有用户界面可略过此步骤。
创建离开频道按钮
a. 在你的 Unity 项目中,右击 Sample Scene,选择 Game Object > UI > Button。此时你可以在场景画布中看到你刚刚创建的按钮。
b. 在 Inspector 面板中,将 Button 重命名为 Leave,并调整按钮的位置:
- 350
- 172
你可以根据自己的需求调整按钮位置。
c. 选中 Leave 按钮的 Text 控件,在 在 Inspector 面板中将 Text 的文本内容修改为 Leave。
d. 重复上述步骤来创建一个 Join 按钮。
创建本地及远端主播视图窗口
a. 右击 Canvas,选择 UI > Raw Image。
b. 创建本地视图窗口。在 Inspector 面板中,将 Raw Image 重命名为LocalView,并调整在画布中位置:
-250
0
250
250
c. 重复上述步骤创建远端视图窗口,将其命名为RemoteView,并调整在画布中的位置:
250
0
250
250
保存上述步骤的更改。
此时你的 UI 界面如下图所示:
本节介绍导入实现视频直播所需的库以及获取摄像头及麦克风设备权限。
在 UNITY_2018_3_OR_NEWER 或以上版本中,Unity 不会主动向用户获取麦克风和相机权限,需要用户调用 CheckPermission
方法获取权限。
仅 Android 平台需要设置此步骤。
新建脚本并导入 Unity 库
a. 在 Project 中,打开 Assets > Agora-Unity-RTC-SDK > Code,右击然后选择 Create > C# Script,此时你的 Assets 中会有一个 NewBehaviourScript.cs
文件,将这个文件重新命名为 JoinChannelVideo.cs
然后打开文件。
b. 将以下代码添加至 UnityEngine;
之后:
using UnityEngine.UI;
获取安卓权限
a. 在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将下列代码添加至 UnityEngine.UI;
之后:
#if (UNITY_2018_3_OR_NEWER && UNITY_ANDROID)
using UnityEngine.Android;
#endif
b. 创建需要获取的权限列表。将下列代码添加至 Start
之前:
#if (UNITY_2018_3_OR_NEWER && UNITY_ANDROID)
private ArrayList permissionList = new ArrayList() { Permission.Camera, Permission.Microphone };
#endif
c. 检查是否已获取权限。将下列代码添加至 Update
之后:
private void CheckPermissions() {
#if (UNITY_2018_3_OR_NEWER && UNITY_ANDROID)
foreach (string permission in permissionList)
{
if (!Permission.HasUserAuthorizedPermission(permission))
{
Permission.RequestUserPermission(permission);
}
}
#endif
}
将脚本和 Canvas 绑定
在 Assets/Agora-Unity-RTC-SDK/Code
中,选择 JoinChannelVideo.cs
文件,将其拖至 Canvas。在 Inspector 面板中你可以看到该文件已经和 Canvas 绑定。
参考以下步骤来实现视频直播逻辑:
导入声网库
在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将下列代码添加至 UnityEngine.UI;
之后:
using Agora.Rtc;
创建加入频道相关变量
在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将下列代码添加至 JoinChannelVideo: MonoBehaviour {
之后:
// 填入你的 app ID。
private string _appID= "";
// 填入你的频道名。
private string _channelName = "";
// 填入 Token。
private string _token = "";
internal VideoSurface LocalView;
internal VideoSurface RemoteView;
internal IRtcEngine RtcEngine;
创建并初始化 IRtcEngine
在调用其他声网 API 前,需要创建并初始化 IRtcEngine
实例。调用 CreateAgoraRtcEngine
来创建并初始化 IRtcEngine
实例。
在 Assets/AgoraEngine/Scripts/JoinChannelVideo.cs
中,将下列代码添加至 CheckPermissions
之后:
private void SetupVideoSDKEngine()
{
// 创建 IRtcEngine 实例。
RtcEngine = Agora.Rtc.RtcEngine.CreateAgoraRtcEngine();
RtcEngineContext context = new RtcEngineContext(_appID, 0,CHANNEL_PROFILE_TYPE.CHANNEL_PROFILE_LIVE_BROADCASTING, AUDIO_SCENARIO_TYPE.AUDIO_SCENARIO_DEFAULT);
// 初始化 IRtcEngine。
RtcEngine.Initialize(context);
}
创建用户回调类实例, 并设置回调。在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将下列代码添加至 SetupVideoSDKEngine()
之后:
private void InitEventHandler()
{
// 创建用户回调类实例, 并设置回调。
UserEventHandler handler = new UserEventHandler(this);
RtcEngine.InitEventHandler(handler);
}
// 实现你自己的回调类,可以继承 IRtcEngineEventHandler 接口类实现。
internal class UserEventHandler : IRtcEngineEventHandler
{
private readonly JoinChannelVideo _videoSample;
internal UserEventHandler(JoinChannelVideo videoSample)
{
_videoSample = videoSample;
}
// 发生错误回调。
public override void OnError(int err, string msg)
{
}
// 用户成功加入频道时,会触发该回调。
public override void OnJoinChannelSuccess(RtcConnection connection, int elapsed)
{
_videoSample.LocalView.SetForUser(0,"");
}
}
UI 元素引用
在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将下列代码添加至 SetupVideoSDKEngine()
之前:
private void SetupUI()
{
GameObject go = GameObject.Find("LocalView");
LocalView = go.AddComponent<VideoSurface>();
go.transform.Rotate(0.0f, 0.0f, -180.0f);
go = GameObject.Find("RemoteView");
RemoteView = go.AddComponent<VideoSurface>();
go.transform.Rotate(0.0f, 0.0f, -180.0f);
go = GameObject.Find("Leave");
go.GetComponent<Button>().onClick.AddListener(Leave);
go = GameObject.Find("Join");
go.GetComponent<Button>().onClick.AddListener(Join);
}
设置本地主播视频显示并加入频道
在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将下列代码 InitEventHandler
之后:
public void Join()
{
// 启用视频模块。
RtcEngine.EnableVideo();
// 设置频道媒体选项。
ChannelMediaOptions options = new ChannelMediaOptions();
// 开始视频渲染。
LocalView.SetEnable(true);
// 自动订阅所有音频流。
options.autoSubscribeAudio.SetValue(true);
// 自动订阅所有视频流。
options.autoSubscribeVideo.SetValue(true);
// 将频道场景设为直播。
options.channelProfile.SetValue(CHANNEL_PROFILE_TYPE.CHANNEL_PROFILE_LIVE_BROADCASTING);
// 将用户角色设为主播。
options.clientRoleType.SetValue(CLIENT_ROLE_TYPE.CLIENT_ROLE_BROADCASTER);
// 加入频道。
RtcEngine.JoinChannel(_token, _channelName, 0, options);
}
设置远端主播视频显示
视频直播中,不论你是主播还是观众,都可以看到频道中的所有主播。在加入频道后,可通过调用 SetForUser
方法设置远端主播的视图。
在 Assets/AgoraEngine/Scripts/JoinChannelVideo.cs
中,将下列代码添加至 OnJoinChannelSuccess
之后:
// 远端主播成功加入频道后,SDK 会触发 OnUserJoined 回调。
public override void OnUserJoined(RtcConnection connection, uint uid, int elapsed)
{
// 设置远端视频显示。
_videoSample.RemoteView.SetForUser(uid, connection.channelId, VIDEO_SOURCE_TYPE.VIDEO_SOURCE_REMOTE);
// 开始视频渲染。
_videoSample.RemoteView.SetEnable(true);
Debug.Log("Remote user joined");
}
设置远端主播离开频道或掉线后停止远端视频显示
在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将下列代码添加至 OnUserJoined
之后:
// 远端用户离开当前频道时会触发该回调。
public override void OnUserOffline(RtcConnection connection, uint uid, USER_OFFLINE_REASON_TYPE reason)
{
// 停止视频渲染。
_videoSample.RemoteView.SetEnable(false);
}
离开频道
根据场景需要,如结束直播时,调用 Leave
离开当前直播频道。在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将下列代码添加至 Join
之后:
public void Leave()
{
Debug.Log("Leaving _channelName");
// 离开频道。
RtcEngine.LeaveChannel();
// 关闭视频模块。
RtcEngine.DisableVideo();
// 停止远端视频渲染。
RemoteView.SetEnable(false);
// 停止远端视频渲染。
LocalView.SetEnable(false);
}
本节介绍如何实现启动及停止你的项目。用户可以通过 Join
及 Leave
按钮来加入、离开视频直播。
检查是否已获取设备权限
调用 CheckPermissions
方法检查是否已获取实现视频直播所需的权限。在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将文件中的 Update
替换为以下代码:
void Update()
{
CheckPermissions();
}
开始视频直播
在 Assets/Agora-Unity-RTC-SDK/Code/JoinChannelVideo.cs
中,将 Start
替换为以下代码:
void Start()
{
SetupVideoSDKEngine();
InitEventHandler();
SetupUI();
}
清理所有会话相关的资源。
离开频道后,如果你想退出应用或者释放 IRtcEngine
内存,需调用 Dispose
方法销毁 IRtcEngine
。将下列代码添加至 Update
之后:
void OnApplicationQuit()
{
if (RtcEngine != null)
{
Leave();
// 销毁 IRtcEngine。
RtcEngine.Dispose();
RtcEngine = null;
}
}
按照以下步骤来测试你的视频直播项目:
Assets/Agora-Unity-RTC-SDK/Code/JoinChannelAudio.cs
中,将你的项目的 App ID、频道名以及临时 Token 分别填入到 _appID
、_channelName
、_token
之后。本节提供了额外的信息供参考。
声网在 GitHub 上提供了一个开源的互动直播示例项目供你参考。