本文将介绍如何快速实现一个简单的实时音视频通话。
相关概念解释:
更多相关概念请参考 术语说明。
在实现基本的音频通话之前,请确保:
SDK 同时也支持 Token 鉴权,若您对项目安全性有更高要求,建议您升级鉴权方式,详情请参考 如何从 AppSign 鉴权升级为 Token 鉴权。
以用户 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. 关闭摄像头
Express Unity SDK 不提供裁剪了视频模块的纯音频包,因此 Unity “实时语音” SDK 实际上是 “实时音视频” SDK。
若要实现纯音频场景,请在创建引擎后调用 EnableCamera 关闭摄像头,以避免启动引擎的视频模块。摄像头关闭后,将不需要再申请摄像头权限,并且不会推视频流。
engine.EnableCamera(false); // 关闭摄像头
更多信息请参考文档 实时音视频 SDK 与实时语音 SDK 的差异。
若您对 Express Unity SDK 包体大小有较高要求,可联系技术支持进行定制裁包,关于 SDK 包大小数据请参考 概述 文档。
1. 登录
创建 ZegoUser 用户对象,设置用户信息 “userID” 和 “userName” 后,调用 LoginRoom,传入房间 ID 参数 “roomId” 和用户参数 “user”,登录房间。如果房间不存在,调用该接口时会创建并登录此房间。
// 创建用户
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 对应的委托,即可收到回调并进行处理。
只有调用 LoginRoom 接口登录房间时传入 ZegoRoomConfig 配置,且 “isUserStatusNotify” 参数取值为 “true” 时,用户才能收到 OnRoomUserUpdate 回调。
通常情况下,如果某个用户想要播放其他用户推送的视频,可以在收到流状态更新(新增)的回调中,调用 StartPlayingStream 接口拉取远端推送的音视频流。
// 房间状态更新回调
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. 监听推流后的事件回调
根据实际应用需要,在推流后监听想要关注的事件通知,比如推流状态更新、推流质量等。
事件回调皆为 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");
如果您需要了解 ZEGO Express SDK 的摄像头/视频/麦克风/音频/扬声器相关接口,请参考 常见问题 - 如何实现开关摄像头/视频画面/麦克风/音频/扬声器?。
1. 开始拉流
调用 StartPlayingStream 接口,根据传入的流 ID 参数 “streamID”,拉取远端推送的音视频流。
远端用户推送的 “streamID” 可以从 ZegoExpressEngine 委托中的 OnRoomStreamUpdate 回调中获得。
// 调用拉流接口
engine.StartPlayingStream(“123”);
2. 监听拉流后的事件回调
根据实际应用需要,在拉流后监听想要关注的事件通知,比如拉流状态更新、拉流质量、流媒体事件等。
事件回调皆为 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");
在真机中运行项目,运行成功后,可以看到本端视频画面。
为方便体验,ZEGO 提供了一个 Web 端调试示例 ,在该页面下,输入相同的 AppID、RoomID,输入不同的 UserID、以及对应的 Token,即可加入同一房间与真机设备互通。当成功开始音视频通话时,可以听到远端的音频,看到远端的视频画面。
1. 停止推流
调用 StopPublishingStream 接口停止向远端用户发送本端的音视频流。
// 停止推流
engine.StopPublishingStream();
2. 停止拉流
调用 StopPlayingStream 接口停止拉取远端推送的音视频流。
如果开发者通过 OnRoomStreamUpdate 回调收到了音视频流 “减少” 的通知,请及时调用 StopPlayingStream 接口停止拉流,避免拉到空流、产生额外的成本;或者,开发者可以根据自己的业务需求,选择合适的时机,主动调用 StopPlayingStream 接口停止拉流。
// 停止拉流
engine.StopPlayingStream("123");
调用 LogoutRoom 接口退出房间。
// 退出房间
engine.LogoutRoom("123666");
调用 DestroyEngine 接口销毁引擎,用于释放 SDK 使用的资源。
// 销毁引擎实例
ZegoExpressEngine.DestroyEngine();
联系我们
文档反馈