用通话统计 UI 监测声网Agora 的视频直播性能

本教程把频道场景从 Agora 默认状态(Communication)改成视频直播(Live Broadcasting)状态,然后用 Unity 的 Canvas UI 实时显示每位主播的属性。

我们还会创建一个应变系统,来应对恶劣网络环境下的视频传送,可以用通话统计 UI 对其进行实时监测。

如果你想跳过对声网Agora 的入门介绍,可以直接跳到调整 Partychat Demo 获取代码。

首先,创建一个声网Agora 账户。声网账户创建指南

此项目是在 agora-party-chat Demo 的基础上搭建的,如果没有使用过这个 Demo,可以先下载一个了解一下基本的 Agora 功能以及 PUN2 的网络运行。Agora 还提供立体声效实例 demo,该 demo 是在 agora-party 聊天 Demo 基础上搭建的。

我们会把 agora-party-chat 作为起始模板,根据说明进行必要的修改,来实现这些功能。点击这里可以查看完整示例代码。

直播场景

Agora SDK 的默认状态是 Communication,最多支持 17 人进行群组视频聊天。在这个示例中,用户可以频道文件设置成 CHANNEL_PROFILE.CHANNEL_PROFILE_LIVE_BROADCASTING,把每位用户角色设定为主播或是观众。频道中的所有成员都能看到主播的视频源,但无法看到或听到观众的视频源。Agora SDK 可以同时支持容纳 100 多万用户进行视频聊天, 是一个非常有用的实时互动工具。

示例: 一群玩家准备开始一场比赛或袭击,队长向队伍发布了一个公告,于是队长的视频流就出现在每个玩家的 UI 上,队长在游戏中的头像会显示特殊的效果,以显示他们是队长并且正在发言。

实时通话统计

Agora 里包含 SDK 中的回调,可以从频道接收数据,便于我们监测频道中每位主播的表现,也可以捕捉或展示比特率、编解码器类型和质量适配等数据。在本示例中,我创建了一个简单的 UI,可以在邻近播放视频的窗口中查看所有数据点,可以保留需要的统计信息,删除其余信息。

视频流回退

示例: 理想状态下,游戏过程中群主能与群成员进行音视频交流,获得良好的游戏体验。但如果网络不稳定,要优先保证成员能听见群主的信息。

Agora 支持用户自定义网络不稳定条件下的 App 策略,比如,当网络带宽不足,无法同时支持视频质量、帧率或音频时,可以对三者进行优先排序。本示例展示了优先保证视频质量的设置,直到视频不可用、频道默认只播放音频。

调整群组聊天Demo

首先,调整访问 Agora 引擎的方式。在 VikingeScene 中创建一个空的游戏对象,将其命名为 AgoraEngine。然后,创建一个脚本并将其命名为 AgoraEngine.cs,把 AgoraEngine.cs 添加到新的游戏对象中。在脚本内初始化 Agora 引擎,创建一个能从其他脚本访问的静态引用:

注意: 请确保你的 Agora 资料中包含你的* App ID *。否则,项目无法正常工作。

在初始化引擎的代码中,将视频渲染方式设置为正方形长宽比渲染(与视频要渲染成的正方形 UI 图像匹配),在游戏退出时清理引擎。

Agora Video Chat

在 AgoraVideoChat.cs 脚本中,删除 Start() 方法中的 Agora 引擎初始化,调整回调来引用你创建好的新 AgoraEngine.cs 脚本,更新 JoinRemoteChannel() mRtcEngine引用,如下所示:

每次离开网络游戏关卡时,都用这个方法销毁 Agora 引擎,并删除 TerminateAgoraEngine() 方法:

设置视频直播配置文件

下一步,实现 Broadcasting Profile 选择。

创建一个名为 ProfileSelection.cs 的脚本,并将其附加到 CharPrefab 玩家游戏对象上。

接下来,创建 UI,让用户以主播或观众角色加入频道。大家可以自行选择样式创建自己的 UI。

为每个角色创建一个带有两个嵌套按钮的面板:

在我的 CharPrefab 中,UI 层次结构如下所示:

monitoring-agora-broadcast-6

我从起始项目的父层次结构中删除了 Viewport UI 对象,因为它隐藏 UI 面板。

我将 ButtonPanel 设置为 False,因为这个 demo 不需要该功能。最后,将 Scroll View UI 对象的 Alpha 频道设置为透明,以免与后面创建的 UI 状态面板冲突。

基础 UI 创建完成后,进入脚本,添加这些变量。对于 UI Elements 部分,确保将合适的 UI 元素从“场景(Scene)”拖动到 Inspector 的相应插槽中:

Start() 方法中,初始化 UI 和直播状态,然后启动 coroutine 以获取 Agora 引擎。

因为 Agora 引擎有异步功能,所以要使用一个 coroutine 来检索。我把计时器设置为 3 秒,如果 3 秒过后仍未找到引擎,该脚本会停止运行并报错。如果检索到引擎,你需要把用户的频道配置文件设置为视频直播(Broadcast)模式,初始化直播回调,并显示刚刚创建的两个按钮:

创建点按“观众(Audience)”或“主播(Broadcaster)”按钮时所触发的函数:

注意: 确保将此函数拖到你的按钮中,否则会没有响应。

对于 Broadcaster 按钮,确保选中该功能旁边的复选框,将 isNewStateBroadcaster 参数设置为 true,将 Audience 复选框保留为 false。

打开 AgoraVideoChat.cs,删除 Start() 中的 mRtcEngine.JoinChannel() 调用,创建一个公共函数来加入频道,如下所示:

在默认的“通信(Communication)”文件,用户可以自动加入。但在这种情况下,你希望通过 UI 设置客户端配置文件后加入频道。

最后一点,以主播角色加入频道的所有用户的玩家模型都会变成金色,用来提示游戏中谁是主播谁是观众。在你的项目中创建金色素材,将其拖动到 broadCasterMaterial 中。将 BaseHuman(SkinnedMeshRenderer)拖到你之前创建的 vikingMesh 变量中。你可以在 Charprefab> Viking> BaseHuman 中找到它:

通话统计

接下来,集成在主播的视频帧旁边显示通话统计 UI 的功能。创建一个名为 UserStatsUI.cs 的脚本,将其附加到 UserVideo 预制件上。

UI面板

创建一个 UI> Panel 对象,作为 UserVideo 预制件的子对象,并为其添加以下属性:

3

为显示视频直播统计信息,我创建了 14 个嵌套在面板内的单独的 UI Text 对象,如下所示:

5

我按照下面的顺序来排列(你可以根据自己的喜好来排列):

UID音频后备

1 4 7

2 5 8

3 6 9

10 11

12

UI脚本

创建以下变量,将文本对象拖动到编辑器 Inspector 中的插槽中:

接下来,禁用 Start() 方法中的“统计信息”面板,设置回调来获取统计信息:

当主播加入频道并创建了 UserVideo 预制件时,会设置 isLocalVideo 属性。

创建方法来设置这个属性,然后在 AgoraVideoChat.cs 中访问它:

monitoring-agora-broadcast-19

执行单击处理器,当用户单击广播的方形视频帧时打开/关闭统计信息面板:

这个函数是从使用 UnityEngine.EventSystems 的 IPointerClickHandler 衍生而来。

如果你没有注册任何点击事件,那可能是你的 UserVideo 预制对象被翻转了。

最后,在面板中实现 Agora 的通话统计信息:

注意: 一定要浏览新创建的脚本的“层次结构(Hierarchy)”视图,并拖入需要的对象和引用。

现在可以进行测试了!

测试流程应如下所示:

  1. 进入 Photon 大厅。

  2. 创建聊天室或加入已有的聊天室。

  3. 除了主播或观众面板外,屏幕均为空白。

  4. 选择主播(Broadcaster)或观众(Audience)。

  5. 如果选择了 Broadcaster,你的本地视频将填充方形 UI 视频的左列。

  6. 点击主播视频来切换统计信息。

  7. 加入另一个客户端,然后单击“主播(Broadcaster)”。单击每个视频源以获取本地和远端视频统计信息。

以上就是本教程的所有内容了!Unity 多人通话 Demo直播性能监测 Demo 提供完成的代码供参考。

如果你想为这个项目以及整个声网Agora 社区做出贡献,欢迎随时在 GitHub 上提交请求,将更改添加到项目中!

原文作者:Joel Thomas
原文链接:https://www.agora.io/en/blog/monitoring-agora-broadcast-performance-with-a-call-stats-ui/

注册登录 后评论
    // 作者
    声网技术社区 发布于 声网开发者社区
    • 0
    // 本帖子
    // 相关帖子
    Coming soon...
    • 0
    用通话统计 UI 监测声网Agora 的视频直播性能声网技术社区 发布于 声网开发者社区