本文将介绍如何快速实现一个简单的实时音视频通话。
相关概念解释:
更多相关概念请参考 术语说明。
在实现基本的音频通话之前,请确保:
SDK 同时也支持 Token 鉴权,若您对项目安全性有更高要求,建议您升级鉴权方式,详情请参考 如何从 AppSign 鉴权升级为 Token 鉴权。
以用户 A 拉取用户 B 的流为例,流程如下图:
整个推拉流过程的 API 调用时序如下图:
1. 引入 SDK
在项目中引入 SDK。
import 'package:zego_express_engine/zego_express_engine.dart';
2. 创建引擎
调用 createEngineWithProfile 接口,将申请到的 AppID 和 AppSign 传入参数 “appID” 和 “appSign”。 Web 平台无需使用 “appsign”,为以免暴露,Web 平台请勿传入 “appsign”。
SDK 同时也支持 Token 鉴权,若您需要升级鉴权方式,可参考 如何从 AppSign 鉴权升级为 Token 鉴权。
ZegoEngineProfile profile = ZegoEngineProfile(
appID, // 请通过官网注册获取,格式为:1234567890
ZegoScenario.General, // 通用场景接入
appSign: appSign,// 请通过官网注册获取,格式为:'0123456789012345678901234567890123456789012345678901234567890123'(共64个字符),Web 平台无需传入
);
// 创建引擎
ZegoExpressEngine.createEngineWithProfile(profile);
3. 关闭摄像头
Express Flutter SDK 不提供裁剪了视频模块的纯音频包,因此 Flutter “实时语音” SDK 实际上是 “实时音视频” SDK。
若要实现纯音频场景,请在创建引擎后调用 enableCamera 关闭摄像头,以避免启动引擎的视频模块。摄像头关闭后,将不需要再申请摄像头权限,并且不会推视频流。
ZegoExpressEngine.instance.enableCamera(false); // 关闭摄像头
更多信息请参考文档 实时音视频 SDK 与实时语音 SDK 的差异。
若您对 Express Flutter SDK 包体大小有较高要求,可联系技术支持进行定制裁包,关于 SDK 包大小数据请参考 概述 文档。
1. 登录
传入用户 ID 参数 “userID” 创建 ZegoUser 用户对象后,调用 loginRoom 接口,传入房间 ID 参数 “roomID” 和用户参数 “user”,登录房间。如果房间不存在,调用该接口时会创建并登录此房间。
// 创建用户对象
ZegoUser user = ZegoUser.id('user1');
// 只有传入 “isUserStatusNotify” 参数取值为 “true” 的 ZegoRoomConfig,才能收到 onRoomUserUpdate 回调。
ZegoRoomConfig config = ZegoRoomConfig.defaultConfig();
config.isUserStatusNotify = true;
// 如果您使用 appsign 的方式鉴权,token 参数不需填写;如果需要使用更加安全的 鉴权方式: token 鉴权,Web 平台仅支持 token 鉴权,请参考[如何从 AppSign 鉴权升级为 Token 鉴权](https://doc-zh.zego.im/faq/token_upgrade?product=ExpressVideo&platform=all)
// config.token = "xxxx";
// 开始登录房间
ZegoExpressEngine.instance.loginRoom('room1', user, config: config);
2. 监听登录房间后的事件回调
根据实际应用需要,在登录房间后监听想要关注的事件通知,比如房间状态更新、用户状态更新、流状态更新等。
onRoomStateUpdate:房间状态更新回调。登录房间后,当房间连接状态发生变更(如出现房间断开,登录认证失败等情况),SDK 会通过该回调通知。
onRoomUserUpdate:用户状态更新回调。登录房间后,当房间内有用户新增或删除时,SDK 会通过该回调通知。
只有调用 loginRoom 接口登录房间时传入 ZegoRoomConfig 配置,且 “isUserStatusNotify” 参数取值为 “true” 时,用户才能收到 onRoomUserUpdate 回调。
onRoomStreamUpdate:流状态更新回调。登录房间后,当房间内有用户新推送或删除音频流时,SDK 会通过该回调通知。
// 以下为常用的房间相关回调
// 房间状态更新回调
ZegoExpressEngine.onRoomStateUpdate = (String roomID, ZegoRoomState state, int errorCode, Map<String, dynamic> extendedData) {
// 根据需要实现事件回调
};
// 用户状态更新
ZegoExpressEngine.onRoomUserUpdate = (String roomID, ZegoUpdateType updateType, List<ZegoUser> userList) {
// 根据需要实现事件回调
};
// 流状态更新
ZegoExpressEngine.onRoomStreamUpdate = (String roomID, ZegoUpdateType updateType, List<ZegoStream> streamList) {
// 根据需要实现事件回调
};
1. 开始推流
调用 startPublishingStream 接口,传入流 ID 参数 “streamID”,向远端用户发送本端的音频流。
同一个 AppID 内,需保证 “streamID” 全局唯一。如果同一个 AppID 内,不同用户各推了一条 “streamID” 相同的流,会导致后推流的用户推流失败。
// 开始推流
ZegoExpressEngine.instance.startPublishingStream("streamID");
3. 监听推流后的事件回调
根据实际应用需要,在推流后监听想要关注的事件通知,比如推流状态更新等。
onPublisherStateUpdate:推流状态更新回调。调用推流接口成功后,当推流状态发生变更(如出现网络中断导致推流异常等情况),SDK 在重试推流的同时,会通过该回调通知。
// 常用的推流相关回调
// 推流状态更新回调
ZegoExpressEngine.onPublisherStateUpdate = (String streamID, ZegoPublisherState state, int errorCode, Map<String, dynamic> extendedData) {
// 根据需要实现事件回调
};
如果您需要了解 Express 的麦克风/音频/扬声器相关接口,请参考 常见问题 - 如何实现开关摄像头/视频画面/麦克风/音频/扬声器?。
调用 startPlayingStream 接口,根据传入的流 ID 参数 “streamID”,拉取远端推送的音频流。
ZegoExpressEngine.instance.startPlayingStream(streamID);
2. 监听拉流后的事件回调
根据实际应用需要,在拉流后监听想要关注的事件通知,比如拉流状态更新等。
onPlayerStateUpdate:拉流状态更新回调。调用拉流接口成功后,当拉流状态发生变更(如出现网络中断导致推流异常等情况),SDK 在重试拉流的同时,会通过该回调通知。
// 常用的拉流相关回调
// 拉流状态相关回调
ZegoExpressEngine.onPlayerStateUpdate = (String streamID, ZegoPlayerState state, int errorCode, Map<String, dynamic> extendedData) {
// 根据需要实现事件回调
};
在真机中运行项目,运行成功后,可以看到本端视频画面。
为方便体验,ZEGO 提供了一个 Web 端调试示例 ,在该页面下,输入相同的 AppID、RoomID,输入不同的 UserID、以及对应的 Token,即可加入同一房间与真机设备互通。当成功开始音视频通话时,可以听到远端的音频,看到远端的视频画面。
1. 停止推流
调用 stopPublishingStream 接口停止向远端用户发送本端的音频流。
// 停止推流
ZegoExpressEngine.instance.stopPublishingStream();
2. 停止拉流
调用 stopPlayingStream 接口停止拉取远端推送的音频流。
如果开发者通过 onRoomStreamUpdate 回调收到了音视频流 “减少” 的通知,请及时调用 stopPlayingStream 接口停止拉流,避免拉到空流、产生额外的成本;或者,开发者可以根据自己的业务需求,选择合适的时机,主动调用 stopPlayingStream 接口停止拉流。
// 停止拉流
ZegoExpressEngine.instance.stopPlayingStream(streamID);
调用 logoutRoom 接口退出房间。
// 退出房间
ZegoExpressEngine.instance.logoutRoom('room1');
调用 destroyEngine 接口销毁引擎,用于释放 SDK 使用的资源。
// 销毁引擎
ZegoExpressEngine.destroyEngine();
联系我们
文档反馈