本文将介绍如何快速实现一个简单的实时音视频通话。
相关概念解释:
更多相关概念请参考 术语说明。
在实现基本的音频通话之前,请确保:
SDK 同时也支持 Token 鉴权,若您对项目安全性有更高要求,建议您升级鉴权方式,详情请参考 如何从 AppSign 鉴权升级为 Token 鉴权。
以用户 A 拉取用户 B 的流为例,流程如下图:
整个推拉流过程的 API 调用时序如下图:
1. 初始化引擎
调用 createEngine 接口,将申请到的 AppID 和 AppSign 传入参数 “appID” 和 “appSign”。
SDK 同时也支持 Token 鉴权,若您需要升级鉴权方式,可参考 如何从 AppSign 鉴权升级为 Token 鉴权。
// 引入 ZegoExpressEngine
const zgEngine = window.require('zego-express-engine-electron/ZegoExpressEngine');
const zgDefines = window.require('zego-express-engine-electron/ZegoExpressDefines');
// 采用通用场景
const profile = {
appID : xxx,
appSign : "xxx",
scenario : zgDefines.ZegoScenario.Default
};
zgEngine.createEngine(profile)
.then(() => {
console.log("success")
}).catch((e) => {
console.log("failed", e)
});
2. 关闭摄像头
Express Electron SDK 不提供裁剪了视频模块的纯音频包,因此 Electron “实时语音” SDK 实际上是 “实时音视频” SDK。
若要实现纯音频场景,请在创建引擎后调用 enableCamera 关闭摄像头,以避免启动引擎的视频模块。摄像头关闭后,将不需要再申请摄像头权限,并且不会推视频流。
zgEngine.enableCamera(false); // 关闭摄像头
更多信息请参考文档 实时音视频 SDK 与实时语音 SDK 的差异。
若您对 Express Electron SDK 包体大小有较高要求,可联系技术支持进行定制裁包,关于 SDK 包大小数据请参考 概述 文档。
3. 设置回调
关于回调的注册和取消,请参考 设置回调
为避免错过事件通知,建议在在创建引擎后立即注册回调
1. 登录
调用 loginRoom 接口,传入房间 ID 参数 “roomID” 和用户参数 “user”,登录房间。如果房间不存在,调用该接口时会创建并登录此房间。
zgEngine.loginRoom("TheRoomID", { userID: "TheUserID", userName: "TheUserName"});
2. 监听登录房间后的事件回调
根据实际应用需要,在登录房间后监听想要关注的事件通知,比如房间状态更新、用户状态更新、流状态更新等。
onRoomStateUpdate:房间状态更新回调。登录房间后,当房间连接状态发生变更(如出现房间断开,登录认证失败等情况),SDK 会通过该回调通知。
onRoomUserUpdate:用户状态更新回调。登录房间后,当房间内有用户新增或删除时,SDK 会通过该回调通知。
只有调用 loginRoom 接口登录房间时传入 ZegoRoomConfig 配置,且 “isUserStatusNotify” 参数取值为 “true” 时,用户才能收到 onRoomUserUpdate 回调。
onRoomStreamUpdate:流状态更新回调。登录房间后,当房间内有用户新推送或删除音视频流时,SDK 会通过该回调通知。
只有调用 loginRoom 接口登录房间时传入 ZegoRoomConfig 配置,且 “isUserStatusNotify” 参数取值为 “true” 时,用户才能收到 onRoomUserUpdate 回调。
通常情况下,如果某个用户想要播放其他用户推送的音频,可以在收到流状态更新(新增)的回调中,调用 startPlayingStream 接口拉取远端推送的音视频流。
// 以下为常用的房间相关回调
// 房间状态更新回调
zgEngine.on("onRoomStateUpdate", (roomID,state,errorCode,extendedData)=>{
// 根据需要实现事件回调
});
// 用户状态更新回调
zgEngine.on("onRoomUserUpdate", (roomID,updateType,userList)=>{
// 根据需要实现事件回调
});
// 流状态更新回调
zgEngine.on("onRoomStreamUpdate", (roomID,updateType,streamList,extendedData)=>{
// 根据需要实现事件回调
});
1. 开始推流
调用 startPublishingStream 接口,传入流 ID 参数 “streamID”,向远端用户发送本端的音视频流。
同一个 AppID 内,需保证 “streamID” 全局唯一。如果同一个 AppID 内,不同用户各推了一条 “streamID” 相同的流,会导致后推流的用户推流失败。
// 开始推流
zgEngine.startPublishingStream("streamID");
2. 监听推流后的事件回调
根据实际应用需要,在推流后监听想要关注的事件通知,比如推流状态更新等。
onPublisherStateUpdate:推流状态更新回调。调用推流接口成功后,当推流状态发生变更(如出现网络中断导致推流异常等情况),SDK 在重试推流的同时,会通过该回调通知。
// 常用的推流相关回调
// 推流状态更新回调
zgEngine.on("onPublisherStateUpdate", (streamID,state,errorCode,extendedData)=>{
// 根据需要实现事件回调
});
如果您需要了解 ZEGO Express SDK 的摄像头/视频/麦克风/音频/扬声器相关接口,请参考 常见问题 - 如何实现开关摄像头/视频画面/麦克风/音频/扬声器?。
1. 开始拉流
调用 startPlayingStream 接口,根据传入的流 ID 参数 “streamID”,拉取远端推送的音视频流。
// 开始拉流
zgEngine.startPlayingStream("streamID", null);
2. 监听拉流后的事件回调
根据实际应用需要,在拉流后监听想要关注的事件通知,比如拉流状态更新等。
onPlayerStateUpdate:拉流状态更新回调。调用拉流接口成功后,当拉流状态发生变更(如出现网络中断导致推流异常等情况),SDK 在重试拉流的同时,会通过该回调通知。
// 常用的拉流相关回调
// 拉流状态相关回调
zgEngine.on("onPlayerStateUpdate", (streamID,state,errorCode,extendedData)=>{
// 根据需要实现事件回调
});
在真机中运行项目,运行成功后,可以看到本端视频画面。
为方便体验,ZEGO 提供了一个 Web 端调试示例 ,在该页面下,输入相同的 AppID、RoomID,输入不同的 UserID、以及对应的 Token,即可加入同一房间与真机设备互通。当成功开始音视频通话时,可以听到远端的音频,看到远端的视频画面。
1. 停止推流
调用 stopPublishingStream 接口停止向远端用户发送本端的音视频流。
// 停止推流
zgEngine.stopPublishingStream();
2. 停止拉流
调用 stopPlayingStream 接口停止拉取远端推送的音视频流。
如果开发者通过 onRoomStreamUpdate 回调收到了音视频流 “减少” 的通知,请及时调用 stopPlayingStream 接口停止拉流,避免拉到空流、产生额外的成本;或者,开发者可以根据自己的业务需求,选择合适的时机,主动调用 stopPlayingStream 接口停止拉流。
// 停止拉流
zgEngine.stopPlayingStream("streamID");
调用 logoutRoom 接口退出房间。
// 退出房间
zgEngine.logoutRoom("TheRoomID");
调用 destroyEngine 接口销毁引擎,用于释放 SDK 使用的资源。
// 销毁引擎
zgEngine.destroyEngine();
1. 当集成 SDK 并使用 Electron9-13 系列版本打包应用后,出现使用 DevTools 的 reload 导致界面 crash、或者出现收不到 SDK 回调的问题,该如何解决?
由于高版本的 Electron(Electron9 或以上版本),允许页面多次加载 Node modules,进而可能会导致 Node Addon module 的底层上下文被多次应用、而产生无法预知的问题。所以在 Electron9 ~ Electron14 之间的版本,可以通过以下方式处理:
在主进程 js 中,设置如下页面属性:app.allowRendererProcessReuse = false
。(注意:这个属性在 Electron14 或以上版本被废弃,所以 Electron14 或以上版本仍然存在这个问题,暂时无法解决。)
2. macOS Monterey(12.2.1) 及以上版本运行 electron 应用导致摄像头、麦克风等设备不能使用或者 crash?
如何解决此问题,详情请参考 FAQ。
联系我们
文档反馈