Agora 声网 - Cocos API
基础库 3.10.0 开始支持,低版本需要做兼容处理
与Cocos 游戏引擎的声网API保持一致
使用方法
Cocos 接入 Agora Voice 的方式不变,导出小游戏后,需要按以下步骤引入:
- 在游戏包根目录下执行
npm install small-game-lib-agora
命令; - 引入 SDK:
// 引入 cocos adapter:
require('adapter-min.js');
// 引入B站小游戏 adapter:
require('blapp-adapter-cocos.js'); // * 具体参考文档:快速开始/引擎导出/Cocos;
// 引入声网 SDK:
require('./node_modules/small-game-lib-agora'); // 1)注意这里要带上 node_modules 一层目录!
// 2)一定要在 cocos 框架文件之前引入!
// 初始化 adapter:
__globalAdapter.init();
// 引入 cocos 框架:
require('cocos/cocos2d-js-min.js');
// 其他代码,关于如何初始化声网 SDK,请参见 文后 Demo
// ...
注意事项
在b站小游戏环境下使用声网服务,需要使用bl.loadAgora能力确保声网服务已经载入,详细使用请看 文后 Demo
由于声网SDK的一些局限性(仅支持存在一个实例),为保证 bilibili App 的其他业务使用声网服务正常,在小游戏进入到后台(拉起控制中心,点击Home键盘,右上角暂停按钮等),会销毁声网服务的实例,接入方需要重新初始化声网服务,并做一些恢复逻辑,详见 文后 Demo
agora的部分功能,需要提供参数,如果由于某些异常情况导致未传参数,会返回错误Code:103,如果agora未初始化,调用其他功能会返回错误Code:7000
接口说明
agora.init(appid)
初始化 Agora,在整个应用全局,开发者只需要对引擎做一次初始化。
agora.setChannelProfile(profile)
设置频道属性
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
profile | Number | 是 | 0 : 通信模式(默认) 1 : 直播模式 |
agora.setClientRole(role)
设置用户角色
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
role | Number | 是 | 1 : 主播 2 : 观众 |
agora.joinChannel(token, channelId, [info], [uid])
加入频道
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
token | String | 是 | 安全要求不高:将值设置为空字符串 安全要求高: 将值设置为 Token 值。 如果你已经启用了 App 证书, 请务必使用 Token |
channelId | String | 是 | 标识通话的频道名称,长度在 64 字节以内的字符串。以下为支持的字符集范围(共 89 个字符): a-z,A-Z,0-9,space,! #$%&,()+, -,:;<=.#$%&,()+,-,:;<=.,>?@[],^_,{ |
info | String | 否 | 开发者需加入的任何附加信息。一般可设置为空字符串,或频道相关信息。该信息不会传递给频道内的其他用户 |
uid | number | 否 | 用户 ID,32 位无符号整数。建议设置范围:1 到 (232-1),并保证唯一性。如果不指定(即设为 0),SDK 会自动分配一个,并在 onJoinChannelSuccess 回调方法中返回,App 层必须记住该返回值并维护,SDK 不对该返回值进行维护,uid 在 SDK 内部用 32 位无符号整数表示,由于 Java 不支持无符号整数,uid 被当成 32 位有符号整数处理,对于过大的整数,Java 会表示为负数,如有需要可以用(uid&0xffffffffL)转换成 64 位整数 |
该方法让用户加入通话频道,在同一个频道内的用户可以互相通话,多个用户加入同一个频道,可以群聊。 使用不同 App ID 的应用程序是不能互通的。如果已在通话中,用户必须调用 agora.leaveChannel() 退出当前通话,才能进入下一个频道。 同一个频道里不能出现两个相同的 UID。如果你的 App 支持多设备同时登录,即同一个用户账号可以在不同的设备上同时登录(例如微信支持在 PC 端和移动端同时登录),请保证传入的 UID 不相同。 例如你之前都是用同一个用户标识作为 UID, 建议从现在开始加上设备 ID, 以保证传入的 UID 不相同 。如果你的 App 不支持多设备同时登录,例如在电脑上登录时,手机上会自动退出,这种情况下就不需要在 UID 上添加设备 ID。
agora.leaveChannel()
离开频道 离开频道,即挂断或退出通话。 joinChannel 后,必须调用 leaveChannel 以结束通话,否则不能进行下一次通话。不管当前是否在通话中,都可以调用 leaveChannel,没有副作用。如果成功,则返回值为 0。leaveChannel 会把会话相关的所有资源释放掉。 leaveChannel 是异步操作,调用返回时并没有真正退出频道。在真正退出频道后,SDK 会触发 onLeaveChannel 回调。
agora.enableAudio()
打开音频
该方法设置内部引擎为启用状态,在 leaveChannel 后仍然有效。
agora.muteLocalAudioStream(mute)
将自己静音
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
mute | Boolean | 是 | true: 麦克风静音 false: 取消麦克风静音 |
静音/取消静音。该方法用于允许/禁止往网络发送本地音频流。
agora.enableLocalAudio(enabled)
关闭/重启本地语音功能
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
enabled | Boolean | 是 | true:重新开启本地语音功能,即开启本地语音采集或处理 false:关闭本地语音功能,即停止本地语音采集或处理 |
当用户加入频道时,语音功能默认是开启的。该方法可以关闭或重新开启本地语音功能,停止或重新开始本地音频采集及处理。 该方法不影响接收或播放远端音频流,适用于只听不发的用户场景。
该方法需要在 joinChannel 之后调用才能生效。 该方法与 muteLocalAudioStream 的区别在于:
- enableLocalAudio:开启或关闭本地语音采集及处理
- muteLocalAudioStream:停止或继续发送本地音频流
agora.muteAllRemoteAudioStreams(mute)
静音所有远端音频
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
mute | Boolean | 是 | True: 停止接收和播放所有远端音频流 False: 允许接收和播放所有远端音频流 |
该方法用于允许/禁止播放远端用户的音频流,即对所有远端用户进行静音与否。
agora.muteRemoteAudioStream(uid, mute)
静音指定用户音频
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
uid | String | 是 | 指定用户 ID |
mute | Boolean | 是 | true: 停止接收和播放指定音频流 false: 允许接收和播放指定音频流 |
静音指定远端用户/对指定远端用户取消静音。
如果之前有调用过 muteAllRemoteAudioStreams (true) 对所有远端音频进行静音,在调用本 API 之前请确保你已调用 muteAllRemoteAudioStreams (false) 。 muteAllRemoteAudioStreams 是全局控制,muteRemoteAudioStream 是精细控制。
agora.enableAudioVolumeIndication(interval, smooth)
启用说话者音量提示
agora.enableAudioVolumeIndication(1000, 3)
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
interval | Number | 是 | 指定音量提示的时间间隔 <= 0:禁用音量提示功能 > 0:返回音量提示的间隔,单位为毫秒。建议设置到大于 200 毫秒。最小不得少于 10 毫秒,否则会收不到 onAudioVolumeIndication 回调 |
smooth | Number | 是 | 平滑系数,指定音量提示的灵敏度。取值范围为 [0-10],建议值为 3,数字越大,波动越灵敏;数字越小,波动越平滑。 |
该方法允许 SDK 定期向应用程序反馈当前谁在说话以及说话者的音量。启用该方法后,无论频道内是否有人说话,都会在 onAudioVolumeIndication 回调中按设置的间隔时间返回音量提示。
agora.adjustRecordingSignalVolume(volume)
调节录音信号音量
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
volume | Number | 是 | 录音信号音量可在 0 ~ 400 范围内进行调节 |
agora.adjustPlaybackSignalVolume(volume)
调节播放信号音量
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
volume | Number | 是 | 录音信号音量可在 0 ~ 400 范围内进行调节Z 0: 静音 100: 原始音量 400: 最大可为原始音量的 4 倍(自带溢出保护) |
该方法调节录音信号音量。
agora.setDefaultAudioRouteToSpeakerphone(bVal)
修改默认的语音路由
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
bVal | Boolean | 是 | true: 默认路由改为外放(扬声器) false: 默认路由改为听筒 无论语音是从外放还是听筒出声,如果插上耳机或连接蓝牙,语音路由会发生相应改变。拔出耳机或断开蓝牙后语音路由将恢复成默认路由。 |
- 该方法只在纯音频模式下工作,在有视频的模式下不工作。
- 该方法需要在 joinChannel 前设置,否则不生效。 如有必要,调用该方法修改默认的语音路由。默认的语音路由如下:
频道模式 | 默认语音路由 |
---|---|
通信 | 语音通话: 听筒 视频通话: 外放 视频通话中关闭视频 : 听筒 |
直播 | 外放 |
已调用 disableVideo 或 已调用 muteLocalVideoStream 或 muteAllRemoteVideoStreams
agora.setParameters(profile)
自定义参数
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
profile | String | 是 | JSON 字符串形式的参数 |
通过 JSON 配置 SDK 提供技术预览或特别定制功能。
agora.getVersion()
查询 SDK 版本号 该方法返回 SDK 版本号的字符串。
agora.setLogFile(filePath)
设置日志文件
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
filePath | String | 是 | 日志文件的完整路径。该日志文件为 UTF-8 编码 |
设置 SDK 的输出 log 文件。SDK 运行时产生的所有 log 将写入该文件。应用程序必须保证指定的目录存在而且可写。
agora.setLogFilter(filter)
设置日志过滤器等级
参数
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
filter | Number | 是 | 设置过滤器等级: LOG_FILTER_OFF = 0:不输出日志信息 LOG_FILTER_DEBUG = 0x80f:输出所有 API 日志信息 LOG_FILTER_INFO = 0x0f:输出 CRITICAL、ERROR、WARNING 和 INFO 级别的日志信息 LOG_FILTER_WARNING = 0x0e:输出 CRITICAL、ERROR 和 WARNING 级别的日志信息 LOG_FILTER_ERROR = 0x0c:输出 CRITICAL 和 ERROR 级别的日志信息 LOG_FILTER_CRITICAL = 0x08:输出 CRITICAL 级别的日志信息 |
设置 SDK 的输出日志过滤等级。不同的过滤等级可以单独或组合使用 日志级别顺序依次为 OFF_、CRITICAL、ERROR、WARNING、INFO 和 DEBUG。选择一个级别,你就可以看到在该级别之前所有级别的日志信息。 例如,你选择 WARNING 级别,就可以看到在 CRITICAL、_ERROR 和 WARNING 级别上的所有日志信息。
agora.on(event, callback, target)
监听事件信息
加入频道成功回调
agora.on('join-channel-success', (channel, uid, elapsed) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
channel | String | 频道名称 |
uid | Number | 用户ID。如果 joinChannel 中指定了 uid,则此处返回该 ID;否则使用 Agora 服务器自动分配的 ID |
elapsed | Number | 从 joinChannel 开始到该事件产生的延迟(毫秒) |
说话声音音量提示回调
agora.on('audio-volume-indication', (speakers, speakerNumber, totalVolume) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
speakers | Array | 说话者(数组)。每个 speaker(): uid: 说话者的用户 ID。如果返回的 uid 为 0,则默认为本地用户 volume: 说话者的音量(0~255) |
speakerNumber | Number | speakers 数组的大小 |
totalVolume | Number | (混音后的)总音量(0~255) |
发生错误回调
agora.on('error', (err, msg) => {}, this)
回调参数
属性 | 类型 | 说明 |
---|---|---|
err | Number | 错误码 |
msg | String | 错误描述 |
离开频道回调
agora.on('leave-channel', (stat) => {}, this)
回调参数
属性 | 类型 | 说明 |
---|---|---|
stat | Object | 通话相关的统计信息。 duration: 通话时长(秒) txBytes: 发送字节数(bytes) rxBytes: 接收字节数(bytes) txKBitRate: 发送码率(kbps) rxKBitRate: 接收码率(kbps) rxAudioKBitRate: 音频接收码率 (kbps) txAudioKBitRate: 音频发送频率 (kbps) rxVideoKBitRate: 视频接收码率 (kbps) txVideoKBitRate: 视频发送码率 (kbps) userCount: 用户离开频道时频道内的瞬时人数 cpuAppUsage: 当前应用程序的 CPU 使用率 (%) cpuTotalUsage: 当前系统的 CPU 使用率 (%) |
其他用户加入当前频道回调
agora.on('user-joined', (uid, elapsed) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
uid | Number | 用户 ID |
elapsed | Number | joinChannel 开始到该回调触发的延迟(毫秒) |
其他用户离开当前频道回调
agora.on('user-offline', (uid, reason) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
uid | Number | 用户 ID |
reason | Number | 离线原因 |
用户被静音回调
agora.on('user-mute-audio', (uid, muted) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
uid | Number | 用户 ID |
muted | Boolean | 是否静音 |
网络中断回调
agora.on('connection-interrupted', () => {}, this);
Token 过期回调
agora.on('request-token', () => {}, this);
上下麦回调
agora.on('client-role-changed', (oldRole, newRole) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
oldRole | Number | 切换前的角色 |
newRole | Number | 切换后的角色 |
重新加入频道成功回调
agora.on('rejoin-channel-success', (channel, uid, elapsed) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
channel | String | 频道名称 |
uid | Number | 用户ID。 |
elapsed | Number | 从 joinChannel 开始到该事件产生的延迟(毫秒) |
声音质量回调
agora.on('audio-quality', (uid, quality, delay, lost) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
uid | Number | 用户 ID |
quality | Number | 音频质量 |
delay | Number | 延迟,单位为毫秒 |
lost | Number | 丢包率,单位为百分比 |
发生警告回调
agora.on('warning', (warn, msg) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
warn | Number | 警告码 |
msg | String | 警告描述 |
频道内网络质量报告回调
agora.on('network-quality', (uid, txQuality, rxQuality) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
uid | Number | 用户ID |
txQuality | Number | 上行网络质量 |
rxQuality | Number | 下行网络质量 |
声音路由发生变化
agora.on('audio-routing-changed', (routing) => {}, this);
属性 | 类型 | 说明 |
---|---|---|
routing | String | 路由信息 |
连接丢失回调
agora.on('connection-lost', () => {}, this);
连接已被禁止回调
agora.on('connection-banned', () => {}, this);
agora 初始化成功
agora.on("init-success", () => {}, this);
录音设备发生变化回调
agora.on('recording-device-changed', (state, device) => {}, this);
回调参数
属性 | 类型 | 说明 |
---|---|---|
state | Number | 设备状态 |
device | String | 设备 |
声网 SDK 初始化 Demo
let channelId = ''; // 用于临时存储当前已加入的房间
// **必须** 先确保 Agora 模块已载入
let agoraSDKLoaded = false;
function loadAgoraSDK() {
return new Promise((resolve, reject) => {
if (agoraSDKLoaded) {
resolve();
return;
}
bl.loadAgora({
success() {
agoraSDKLoaded = true;
resolve();
},
fail: reject
});
});
}
// 调用 Agora 能力前**必须**先授权录音权限
function authorizeRecord() {
return new Promise((resolve, reject) => {
bl.authorize({
scope: 'scope.record',
success: resolve,
fail: reject
});
});
}
// 每次打开时需要恢复声网 SDK:
bl.onShow(() => {
// 在这里恢复引擎、以及加入过的房间
loadAgoraSDK()
.then(authorizeRecord)
.then(() => {
agora.init( /*<Agora AppId>*/ );
if (channelId.length > 0) {
agora.on('join-channel-success', () => {
// 加入成功逻辑处理
});
agora.joinChannel('', channelId, '', '<用户 ID>');
}
})
.catch(err => {
// 处理异常
});
});
// 每次离开时记录当前的房间,以备下次打开时重新进入:
bl.onHide(() => {
channelId = '<当前房间 ID>';
});