前面我们分享了 Unity 语音通话 demo 示例源码和SDK集成文章,本文将介绍如何基于Unity C#快速实现一个简单的实时音视频通话。
相关概念简介
- ZEGO Express SDK:由 ZEGO 提供的实时音视频 SDK,能够为开发者提供便捷接入、高清流畅、多平台互通、低延迟、高并发的音视频服务。
- 推流:把采集阶段封包好的音视频数据流推送到 ZEGO 实时音视频云的过程。
- 拉流:从 ZEGO 实时音视频云将已有音视频数据流拉取播放的过程。
- 房间:是 ZEGO 提供的音视频空间服务,用于组织用户群,同一房间内的用户可以互相收发实时音视频及消息。
- 用户需要先登录某个房间,才能进行推流、拉流操作。
- 用户只能收到自己所在房间内的相关消息(用户进出、音视频流变化等)。
更多相关概念请参考 术语说明。
Unity语音通话实现条件
在实现基本的音频通话之前,请确保:
- 已在项目中集成 ZEGO Express SDK,实现基本的实时音视频功能,详情请参考 Unity语音通话sdk接入集成。
- 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 AppSign,详情请参考 控制台 – 项目管理 中的“项目信息”。
Unity语音通话实现步骤
以用户 A 拉取用户 B 的流为例,流程如下图:
整个推拉流过程的 API 调用时序如下图:
创建引擎
1. 创建引擎
调用 CreateEngine 接口,将申请到到 AppID 和 AppSign 传入参数 “appId” 和 “appSign”,创建引擎单例对象。
// 定义 SDK 引擎对象
ZegoExpressEngine engine;
ZegoEngineProfile profile = new ZegoEngineProfile();
profile.appID = appID; // 请通过官网注册获取,格式为 123456789
profile.appSign = appSign; // 请通过官网注册获取,格式为"0123456789012345678901234567890123456789012345678901234567890123",64个字符
profile.scenario = ZegoScenario.HighQualityVideoCall; // 高品质音视频通话场景接入(请根据实际情况选择合适的场景)
// 初始化SDK
engine = ZegoExpressEngine.CreateEngine(profile);
2. 关闭摄像头
若要实现纯音频场景,请在创建引擎后调用 EnableCamera 关闭摄像头,以避免启动引擎的视频模块。摄像头关闭后,将不需要再申请摄像头权限,并且不会推视频流。
engine.EnableCamera(false); // 关闭摄像头
登录房间
1. 登录
创建 ZegoUser 用户对象,设置用户信息 “userID” 和 “userName” 后,调用 LoginRoom,传入房间 ID 参数 “roomId” 和用户参数 “user”,登录房间。如果房间不存在,调用该接口时会创建并登录此房间。
- 同一个 AppID 内,需保证 “roomId” 全局唯一。
- 同一个 AppID 内,需保证 “userId” 全局唯一,建议开发者将其设置成一个有意义的值,可将 “userId” 与自己业务账号系统进行关联。
- “userId” 与 “userName” 不能为空,否则会导致登录房间失败。
// 创建用户
ZegoUser user = new ZegoUser();
user.userId="xxx";
user.userName="xxxx";
// 只有传入 “isUserStatusNotify” 参数取值为 “true” 的 ZegoRoomConfig,才能收到 onRoomUserUpdate 回调。
ZegoRoomConfig roomConfig = new ZegoRoomConfig();
// 如果您使用 appsign 的方式鉴权,token 参数不需填写;如果需要使用更加安全的 鉴权方式: token 鉴权,请参考[如何从 AppSign 鉴权升级为 Token 鉴权](https://doc-zh.zego.im/faq/token_upgrade?product=ExpressVideo&platform=all)
// roomConfig.token = "xxxx";
roomConfig.isUserStatusNotify = true;
// 登录房间
engine.LoginRoom("123666", user, roomConfig);
2. 监听登录房间后的事件回调
根据实际需要,在登录房间后监听想要关注的事件通知,比如房间状态更新、用户状态更新、流状态更新等。
- OnRoomStateUpdate:房间状态更新回调。登录房间后,当房间连接状态发生变更(如出现房间断开,登录认证失败等情况),SDK 会通过该回调通知。
- OnRoomUserUpdate:用户状态更新回调。登录房间后,当房间内有用户新增或删除时,SDK 会通过该回调通知。 只有调用 LoginRoom 接口登录房间时传入 ZegoRoomConfig 配置,且 “isUserStatusNotify” 参数取值为 “true” 时,用户才能收到 onRoomUserUpdate 回调。
- OnRoomStreamUpdate:流状态更新回调。登录房间后,当房间内有用户新推送或删除音视频流时,SDK 会通过该回调通知。
事件回调皆为 ZegoExpressEngine 的委托,开发者直接将自己实现的回调处理函数赋值给 ZegoExpressEngine 对应的委托,即可收到回调并进行处理。
// 房间状态更新回调
public void OnRoomStateUpdate(string roomId, ZegoRoomState state, int errorCode, string extendedData) {
// 根据需要实现事件回调
}
// 用户状态更新回调
private void OnRoomUserUpdate(string roomId, ZegoUpdateType updateType, List<ZegoUser> userList, uint userCount) {
// 根据需要实现事件回调
}
// 流状态更新回调
private void OnRoomStreamUpdate(string roomId, ZegoUpdateType updateType, List<ZegoStream> streamInfoList, uint streamInfoCount) {
// 根据需要实现事件回调
}
// 赋值给 ZegoExpressEngine 对应的事件委托
engine.onRoomStateUpdate = OnRoomStateUpdate;
engine.onRoomUserUpdate = OnRoomUserUpdate;
engine.onRoomStreamUpdate = OnRoomStreamUpdate;
推流
1. 开始推流
调用 StartPublishingStream 接口,传入流 ID 参数 “streamId”,向远端用户发送本端的音视频流。
同一个 AppID 内,需保证 “streamId” 全局唯一。如果同一个 AppID 内,不同用户各推了一条 “streamId” 相同的流,会导致后推流的用户推流失败。
// 开始推流
engine.StartPublishingStream("stream1");
3. 监听推流后的事件回调
根据实际应用需要,在推流后监听想要关注的事件通知,比如推流状态更新、推流质量等。
- OnPublisherStateUpdate:推流状态更新回调。调用推流接口成功后,当推流状态发生变更(如出现网络中断导致推流异常等情况),SDK 在重试推流的同时,会通过该回调通知。
- OnPublisherQualityUpdate:推流质量回调。调用推流接口成功后,定时回调音视频流质量数据(如分辨率、帧率、码率等)。
事件回调皆为 ZegoExpressEngine 的委托,开发者直接将自己实现的回调处理函数赋值给 ZegoExpressEngine 对应的委托,即可收到回调并进行处理。
// 推流状态更新回调
public void OnPublisherStateUpdate(string streamId, ZegoPublisherState state, int errorCode, string extendedData)
{
// 根据需要实现事件回调
}
// 推流质量回调
private void OnPublisherQualityUpdate(string streamId, ZegoPublishStreamQuality quality)
{
// 根据需要实现事件回调
}
// 赋值给 ZegoExpressEngine 对应的事件委托
engine.onPublisherStateUpdate = OnPublisherStateUpdate;
engine.onPublisherQualityUpdate = OnPublisherQualityUpdate;
engine.StartPublishingStream("stream1");
拉流
1. 开始拉流
调用 StartPlayingStream 接口,根据传入的流 ID 参数 “streamID”,拉取远端推送的音视频流。
// 调用拉流接口
engine.StartPlayingStream(“123”);
2. 监听拉流后的事件回调
根据实际应用需要,在拉流后监听想要关注的事件通知,比如拉流状态更新、拉流质量、流媒体事件等。
- OnPlayerStateUpdate:拉流状态更新回调。调用拉流接口成功后,当拉流状态发生变更(如出现网络中断导致推流异常等情况),SDK 在重试拉流的同时,会通过该回调通知。
- OnPlayerQualityUpdate:拉流质量回调。拉流成功后每 3 秒会收到此回调,通过该回调可以获取拉取的音视频流的帧率,码率,RTT,丢包率等质量数据,实时监控拉取流的健康情况。
- OnPlayerMediaEvent:流媒体事件回调。当拉流发生音视频卡顿以及恢复等事件发生时会触发此回调。
事件回调皆为 ZegoExpressEngine 的委托,开发者直接将自己实现的回调处理函数赋值给 ZegoExpressEngine 对应的委托,即可收到回调并进行处理。
// 拉流状态更新回调
public void OnPlayerStateUpdate(string streamId, ZegoPlayerState state, int errorCode, string extendedData)
{
// 根据需要实现事件回调
}
// 拉流质量回调
private void OnPlayerQualityUpdate(string streamId, ZegoPlayStreamQuality quality)
{
// 根据需要实现事件回调
}
// 流媒体事件回调
private void OnPlayerMediaEvent(string streamId, ZegoPlayerMediaEvent mediaEvent)
{
// 根据需要实现事件回调
}
// 赋值给 ZegoExpressEngine 对应的事件委托
engine.onPlayerStateUpdate = OnPlayerStateUpdate;
engine.onPlayerMediaEvent = OnPlayerMediaEvent;
engine.onPlayerQualityUpdate = OnPlayerQualityUpdate;
engine.StartPlayingStream("123");
停止推拉流
1. 停止推流
调用 StopPublishingStream 接口停止向远端用户发送本端的音视频流。
// 停止推流
engine.StopPublishingStream();
2. 停止拉流
调用 StopPlayingStream 接口停止拉取远端推送的音视频流。
// 停止拉流
engine.StopPlayingStream("123");
退出房间
调用 LogoutRoom 接口退出房间。
// 退出房间
engine.LogoutRoom("123666");
销毁引擎
调用 DestroyEngine 接口销毁引擎,用于释放 SDK 使用的资源。
// 销毁引擎实例
ZegoExpressEngine.DestroyEngine();
小记
Unity语音通话开发系列到此篇文章就结束了,感兴趣的朋友可以留言讨论或访问即构官网免费体验相关功能。
本文为原创稿件,版权归作者所有,如需转载,请注明出处:https://www.nxrte.com/jishu/yinshipin/6957.html