CloudHub JSSDK
- 概览
- CloudHubRTC
- CloudHubRTCObject
- Client
- ClientEvent
- ClientLiveTranscoding
- ClientChannelMediaRelayConfig
- Stream
- StreamEvent
- DeviceManager
- 常量
Client 事件文档
说明:该回调通知 App 接收到聊天消息。
基础
app-exception
说明:该回调通知 App 程序出现异常。
回调参数 evt 结构:
{
errorinfo:"error info"
}
// Example:
client.on("app-exception", function (evt) {
console.error("app-exception", evt.errorinfo);
})
signal-connect-fail
说明:该回调通知与服务器建立连接失败。
回调参数 evt 结构:
{
errflag:"INVALID_ARG"
message:"channel or tokenOrKey is invalid param",
retryConnect: false
}
Note: errflag 可能值如下:
- “CHANNEL_NO_SPECIFICATION”: 参数 channel 不符合规范,含有不支持的字符。 【不会重连】
- “INVALID_ARG”: 无效的参数。 【不会重连】
- “CLIENT_NOT_INIT”: 没有初始化 Client。 【不会重连】
- “EMPTY_SIGNAL_ADDR_LIST”: 没有可连接的信令服务器地址。 【不会重连】
- “JOIN_CHANNEL_FAIL”: 加入频道失败。 【不会重连】
- “CHANNEL_CONNECT_ERROR”: 与信令服务器连接断开。【会重连】
- “JOIN_AUTH_FAIL”: 加入频道验证权限失败。【不会重连】
- “CHANNEL_MODE_MISMATCH”:频道模式不匹配,比如:频道场景是通话场景 (mode 为 live),但是 CreateClient 时传成了直播场景 (mode 为 rtc)。
- “ERR_INVALID_APP_ID”: 无效的 appId。【不会重连】
- “ERR_INVALID_TOKEN”: 无效的 token。【不会重连】
- “ERR_TOKEN_EXPIRED”: token 已过期。【不会重连】
- “ERR_ENTERPRISE_CONCURRENT_POINTS_EXCEED_LIMIT”: 企业并发点数超限。【不会重连】
- “ERR_REFUSED”: 其它错误。【不会重连】
// Example:
client.on("signal-connect-fail", function(evt) {
console.log("signal-connect-fail", evt);
});
need-reload-page
说明:该回调通知界面需要重新加载 (即:界面刷新)。
Note: 经过测试发现在 Win8.1 上有些机器请求视频设备失败后摄像头再也打不开摄像头设备,SDK 会记住这种设备状态,但需要界面重新加载(即:界面刷新)来恢复摄像头的使用。
// Example:
client.on("need-reload-page", function(evt) {
console.log("need-reload-page", evt);
window.location.reload();
});
client-role-changed
说明:该回调通知本地用户的角色发生改变。
直播场景下,当用户角色切换时会触发此回调,即主播切换为观众,或观众切换为主播时。
回调参数 evt 结构:
// Example:
client.on("client-role-changed", function(evt) {
console.log("client-role-changed", evt);
});
request-token
说明:该回调通知 App 需要生成新的 Token,然后调用 joinChannel,使用新的 Token 重新加入频道。
回调参数 evt 结构:
{
token:"token 加密串"
}
Note:
- 收到该回调时 SDK 已自动离开频道。
- token 的生成由 authkey、secretkey 、channel、userid、expiretime 组合生成,所以请确保新生成的 token 使用的 authkey、secretkey 、channel、userid 不变。
// Example:
client.on("request-token", function(evt) {
console.log("request-token", evt);
});
token-privilege-will-expire
说明:该回调通知 App Token 服务即将过期回调。
回调参数 evt 结构:
{
token:"token 加密串"
}
Note:
- 在调用 joinChannel 时如果指定了 Token,由于 Token 具有一定的时效,在通话过程中如果 Token 即将失效,SDK 会提前 30 秒触发该回调,提醒 App 更新 Token。 当收到该回调时,用户需要重新在服务端生成新的 Token,然后调用 renewToken 将新生成的 Token 传给 SDK。
- token 的生成由 authkey、secretkey 、channel、userid、expiretime 组合生成,所以请确保新生成的 token 使用的 authkey、secretkey 、channel、userid 不变。
// Example:
client.on("token-privilege-will-expire", function(evt) {
console.log("token-privilege-will-expire", evt);
});
server-record-state-change
说明:该回调通知 App 服务器录制状态发生了改变。
回调参数 evt 结构:
{
isRecording:true,
isPause:false,
recordState:1,
startTs:1600152559163,
pauseDuration:2798,
recordDuration:9081,
currTs:1600152962101
}
Note:
- recordState 的值:0: 停止录制 1: 开始录制 (正在录制) 2: 暂停录制 【注: 恢复录制 recordState 值变为 1】。
- 当 recordState 为 0 时,startTs、pauseDuration、recordDuration 都为 - 1。
// Example:
client.on("server-record-state-change", function(evt) {
console.log("server-record-state-change", evt);
});
stream-publish-failure
说明:该回调通知 App 流发布失败。触发此事件后,流不会重新发布。
回调参数 evt 结构:
{
reason:"PUBLISH_STREAM_LIMIT",
stream:Stream
}
Note: Note:reason 有以下值
- “STREAM_ALREADY_PUBLISHED”: 该 stream 已经发布。
- “INVALID_LOCAL_STREAM”: 传入的 stream 格式非法。
- “STREAM_NOT_INITED”: 本地流没有初始化完成。
- “SIGNAL_NOT_CONNECT”: 当前不在频道中,可能是没有加入频道或者是网络波动导致暂时断开连接。
- “PUBLISH_STREAM_LIMIT”: 发布的音视频最大路数超过限制。
- “PUBLISH_NOT_PERMISSION”: 没有权限发布。
- “PUB_SETREMOTEDESC_FAIL”: 浏览器 setRemoteDescription 失败,关于 setRemoteDescription
可以参考: https://developer.mozilla.org/zh-CN/docs/Web/API/RTCPeerConnection/setRemoteDescription
// Example:
client.on("stream-publish-failure",function(evt){
var stream = evt.stream;
console.log("stream-publish-failure",stream.getId());
})
stream-subscribe-failure
说明:该回调通知 App 流订阅失败。触发此事件后,流不会重新订阅。
回调参数 evt 结构:
{
reason:"SUBSCRIBE_NOT_PERMISSION",
stream:Stream
}
Note: Note:reason 有以下值
- “STREAM_ALREADY_SUBSCRIBED”: 该 stream 已经订阅。
- “STREAM_NOT_YET_PUBLISHED”: 指定的 stream 还没有发布。
- “INVALID_REMOTE_STREAM”: 传入的 stream 格式非法。
- “SIGNAL_NOT_CONNECT”: 当前不在频道中,可能是没有加入频道或者是网络波动导致暂时断开连接。
- “SUBSCRIBE_NOT_PERMISSION”: 没有权限订阅。
- “SUB_SETREMOTEDESC_FAIL”: 浏览器 setRemoteDescription 失败,关于 setRemoteDescription
可以参考: https://developer.mozilla.org/zh-CN/docs/Web/API/RTCPeerConnection/setRemoteDescription
// Example:
client.on("stream-subscribe-failure",function(evt){
var stream = evt.stream;
console.log("stream-subscribe-failure",stream.getId());
})
publish-permission
说明:该回调通知 App 是否有发布权限。
回调参数 evt 结构:
{
hasPermission: true
}
Note:
- 进入频道前认为有发布权限,如果没有发布权限,则进入频道后会收到 Client.on(“publish-permission”) 的回调,此时 hasPermission 为 false。
- 频道断开重连请将发布权限重置为:有权限状态
// Example:
client.on("publish-permission", function(evt) {
console.log("publish-permission", evt);
})
subscribe-permission
说明:该回调通知 App 是否有订阅权限。
回调参数 evt 结构:
{
hasPermission: true,
}
Note:
- 进入频道前认为有订阅权限,如果没有订阅权限,则进入频道后会收到 Client.on(“subscribe-permission”) 的回调,此时 hasPermission 为 false。
- 频道断开重连请将订阅权限重置为:有权限状态
// Example:
client.on("subscribe-permission", function(evt) {
console.log("subscribe-permission", evt);
})
channel-media-relay-state
说明:该回调通知 App 跨房间流转发的状态。
回调参数 evt 结构:
{
destChannelName: 'dest01',
connState: 'connecting',
stateDesc: 'connecting to dest channel'
}
connState 有以下几种情况:
- connecting: 正在与目标频道建立连接
- connected: 与目标频道建立连接成功
- invalidDestChanne: 目标频道的 channelName 无效
- connectFai: 与目标连接建立连接失败
- connectLost: 与目标连接的连接中断
- unknownError: 未知错误
- stop: 主动断开与目标的连接 (即:用户调用 startChannelMediaRelay/updateChannelMediaRelay/stopChannelMediaRelay 接口主动断开)
- clientRoleNotHost: 用户不是主播(即:clientRole 不为 host)
Note:
- channel-media-relay-state 只有流转发的发起者 (即: 接口调用者) 才能收到此事件通知。
- 当 connState 为 “stop” 时表示此连接被主动关闭,服务器会从流转发的连接列表中删除此连接,不会再通知此链接的信息。
- 当 connState 为 “connected” 时,表示源频道与目标频道通道连接成功,服务器此时会开始转发接口调用者的流给目标房间用户。
- 当 connState 从 “connected” 转为非 “connected” 时,服务器会停止转发接口调用者的流。
- 当 connState 从 “connected” 转为非 “connected” 时,不会进行重连。
- 当 connState 为 “connected” 后,会有以下通知: 目标频道的用户会触发 client.on(“peer-join”) 事件,事件携带 fromChannelName 表示接口调用者来自的频道名,如果接口调用者发布了流,则目标频道的用户会触发 client.on(“stream-added”) 事件。
- 当 connState 从 “connected” 转为非 “connected” 后,会有以下通知: 目标频道的用户会触发 client.on(“peer-leave”) 事件,如果接口调用者发布了流,则目标频道的用户会触发 client.on(“stream-removed”) 事件。
// Example:
client.on("channel-media-relay-state", function(evt) {
console.log("channel-media-relay-state", evt);
})
channel-force-closed
说明:该回调通知 App 频道已经被强制关闭。
回调参数 evt 结构:
{
reasoncode: 1,
}
音视频
stream-volume-indicator
说明:该回调定期返回已发布 / 已订阅的流的音量提示。
默认禁用。可以通过 enableAudioVolumeIndicator(interval?:number) 方法开启; 开启后,无论频道内是否有人说话,都会每隔 interval 毫秒返回音量提示。
音量范围为 0 到 100 之间的整数。
只返回流类型为 video 的音量提示(即:stream.getType() === “video”)
回调参数 evt 结构:
[{
stream:Stream
volume:10,
}]
// Example:
client.on("stream-volume-indicator", function(evt){
var volsobj = {};
evt.forEach(function(item){
volsobj[item.stream.getId()] = item.volume;
});
console.log("recv client event, stream-volume-indicator", volsobj);
});
stream-published
说明:该回调通知 App 本地音视频流已发布。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("stream-published", function(evt) {
console.log("stream-published", evt.stream.getId());
})
stream-unpublished
说明:该回调通知应用本地音视频流已取消发布。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("stream-unpublished", function(evt) {
console.log("stream-unpublished", evt.stream.getId());
})
first-audio-frame-decode
说明:已完成远端音频首帧解码回调。
本地订阅远端流成功并完成第一帧音频解码时会触发该回调。
回调参数 evt 结构:
{
stream:Stream
}
Note: Edge 浏览器不支持
// Example:
client.on('first-audio-frame-decode', function (evt) {
console.log('first-audio-frame-decode');
console.log(evt.stream.getId());
});
first-video-frame-decode
说明:已完成远端视频首帧解码回调。
本地订阅远端流成功并完成第一帧视频解码时会触发该回调。
回调参数 evt 结构:
{
stream:Stream
}
Note: Edge 浏览器不支持
// Example:
client.on('first-video-frame-decode', function (evt) {
console.log('first-video-frame-decode');
console.log(evt.stream.getId());
})
stream-added
说明:该回调通知 App 远端音视频流已添加。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("stream-added", function(evt) {
var stream = evt.stream;
console.log("new stream added", stream.getId());
})
stream-removed
说明:该回调通知 App 已删除远端音视频流。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("stream-removed", function(evt) {
var stream = evt.stream;
console.log("remote stream was removed", stream.getId());
});
stream-reconnect-start
说明:该回调通知 SDK 开始尝试重新发布 / 订阅音视频流。
回调参数 evt 结构:
{
reason:"PUB_FAILED",
stream:Stream
}
Note: reason 有以下值
- “PUB_ACK_FAILED”: 发布 ACK 失败,一般是在发布过程中连接丢失【注:此失败 SDK 会自动重新发布】。
- “PUB_TIMEOUT”: 发布超时【注:SDK 会自动重新发布】。
- “PUB_CONNECTION_FAILED”: 发布后媒体传输通道建立失败【注:SDK 会自动重新发布】。
- “PUB_CONNECTION_INSTABILITY”: 流已经发布成功,但是媒体传输通道不稳定,需要强制重新发布【注:SDK 会自动重新发布】。
- “PUB_CONNECTION_ICE_DISCONNECTED”: 流已经发布成功,但媒体传输通道断开连接【注:SDK 会自动重新发布】。
- “PUB_APP_HIDDEN_CATON”: 发布成功后因为隐藏 APP(如:按 Home 键) 后重新显示 APP 导致卡顿【注:SDK 会自动重新发布】。
- “PUB_UNDEFINED_FAIL”: 未定义的发布失败【注:SDK 会自动重新发布】。
- “PUB_SDK_FORCE_RECONN”: 因为浏览器版本过低,进行切换设备 / 切换分辨率,需要强制重新发布【注:SDK 会自动重新发布】。
- “SUB_ACK_FAILED”: 订阅 ACK 失败,一般是在订阅过程中连接断开【注:SDK 会自动重新订阅】。
- “SUB_TIMEOUT”: 订阅超时【注:SDK 会自动重新订阅】。
- “SUB_CONNECTION_FAILED”: 订阅后媒体传输通道建立失败【注:SDK 会自动重新订阅】。
- “SUB_CONNECTION_INSTABILITY”: 流已经订阅成功,但是媒体传输通道不稳定,需要强制重新订阅【注:SDK 会自动重新订阅】。
- “SUB_CONNECTION_ICE_DISCONNECTED”: 流已经订阅成功,但媒体传输通道断开连接【注:SDK 会自动重新订阅】。
- “SUB_APP_HIDDEN_CATON”: 订阅成功后因为隐藏 APP(如:按 Home 键) 后重新显示 APP 导致卡顿【注:SDK 会自动重新订阅】。
- “SUB_UNDEFINED_FAIL”: 未定义的订阅失败【注:SDK 会自动重新订阅】。
// Example:
client.on("stream-reconnect-start", function(evt) {
console.log(evt.stream.getId(), evt.reason);
})
stream-reconnect-end
说明:该回调通知重新发布 / 订阅音视频流结束。
回调参数 evt 结构
{
reason:"",
success:true,
stream:Stream
}
// Example:
client.on('stream-reconnect-end', function(evt) {
console.log(evt.stream.getId(), evt.success, evt.reason);
})
stream-subscribed
说明:该回调通知 App 已订阅上远端音视频流。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("stream-subscribed", function(evt) {
var stream = evt.stream;
console.log("stream-subscribed", stream.getId());
})
stream-unsubscribed
说明:该回调通知 App 已取消订阅远端音视频流。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("stream-unsubscribed", function(evt) {
var stream = evt.stream;
console.log("stream-unsubscribed", stream.getId());
})
stream-network-quality
说明:该回调报告流的网络质量。
该回调每 2 秒触发,向 App 报告本地用户当前的上行和下行网络质量。
回调参数 evt 结构:
[{
stream:Stream //stream:Stream Stream对象
quality:NetworkQualityStats //quality:object NetworkQualityStats详情请看 CloudHubRTC数据对象文档
}]
Note: Edge 浏览器不支持
// Example:
client.on("stream-network-quality", function (evt) {
var netobjs = {};
evt.forEach(function(item){
netobjs[item.stream.getId()] = item.quality;
});
console.log("recv client event, stream-network-quality", netobjs);
})
mute-audio
说明:该回调通知 App 对方用户将自己的声音关掉。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("mute-audio", function(evt) {
console.log("mute audio:" + evt.stream.getId());
});
unmute-audio
说明:该回调通知 App 对方用户将自己的声音打开。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("unmute-audio", function (evt) {
console.log("unmute audio:" + evt.stream.getId());
});
mute-video
说明:该回调通知 App 对方用户将自己的视频关掉。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("mute-video", function (evt) {
console.log("mute video" + evt.stream.getId());
})
unmute-video
说明:该回调通知 App 对方用户将自己的视频打开。
回调参数 evt 结构:
{
stream:Stream
}
// Example:
client.on("unmute-video", function (evt) {
console.log("unmute video:" + evt.stream.getId());
})
信令
recv-pub-msg
说明:该回调通知 App 接收到" 发送信令消息"。
回调参数 evt 结构:
{
isNowMsg :true,
fromID: "7f890bd6-d79d-9b99-3861-5dc08377ab6a",
data: {info: "测试 pubMsg"},
id: "TestPubmsgId",
name: 'TestPubmsg',
seq: 1,
toID: "__all",
ts: 1587974788
}
Note: isNowMsg 如果为 true,则表示是在用户本人加入频道之后才发送的信令消息,如果为 false 则表示此信令消息在用户本人加入频道前就已经发送了。
// Example:
client.on("recv-pub-msg", function(evt){
console.log(evt);
});
recv-del-msg
说明:该回调通知 App 接收到" 删除信令消息"。
回调参数 evt 结构:
{
fromID: "7f890bd6-d79d-9b99-3861-5dc08377ab6a",
id: "TestPubmsgId",
name: "TestPubmsg",
seq: 1,
toID: "__all",
ts: 1587974788
}
// Example:
client.on("recv-del-msg", function(evt){
console.log(evt);
});
signal-connected
说明:该回调通知与服务器已经成功建立连接。
回调参数 evt 结构:
{
currServerTs: 1587974203,
}
// Example:
client.on("signal-connected", function(evt) {
console.log("signal-connected", evt);
});
signal-reconnect
说明:该回调通知正在与服务器重新建立连接。
Note: 当收到该事件后需要清除 UI 层缓存的数据,如流列表、用户列表、UI 界面等。
// Example:
client.on("signal-reconnect", function() {
console.log("signal-reconnect");
})
signal-connection-state-change
说明:该回调通知 App SDK 与服务器的连接状态发生改变。
SDK 与服务器的连接状态共有以下 3 种:
- DISCONNECTED:连接断开。该状态表示 SDK 处于以下任一阶段:
- 调用 Client.joinChannel 加入频道前的初始化阶段
- 调用 Client.leaveChannel 后的离开频道阶段
- CONNECTING:正在连接中。在调用 Client.joinChannel 或者连接中断自动重连的时候为此状态。
- CONNECTED:已连接。该状态表示用户已经加入频道,可以在频道内发布或订阅媒体流。如果因网络断开或切换而导致 SDK 与服务器的连接中断,SDK 会自动重连,此时 App 会收到该回调,通知网络状态由 CONNECTED 变为 CONNECTING。
回调参数 evt 结构:
{
curState:"CONNECTING",
prevState:"CONNECTED"
}
Note:
当状态变为 DISCONNECTED 后需要清除 UI 层缓存的数据,如流列表、用户列表、UI 界面、频道已关闭连接等。【注:此状态一般为用户调用 leaveChannel 或者被踢出频道时触发,会真正与服务器断开连接,不会进行重连】
当收到 signal-reconnect 事件时 (即:状态为 CONNECTING),需要清除 UI 层缓存的数据,如流列表、用户列表、UI 界面等。【注:此状态一般为当前网络与服务器断开连接,会进行重连,当网络恢复时就能重连上服务器】
// Example:
client.on("signal-connection-state-change", function(evt) {
console.log(evt.prevState, evt.curState);
})
聊天
recv-chat-msg
说明:该回调通知 App 接收到聊天消息。
回调参数 evt 结构:
{
fromID: "7f890bd6-d79d-9b99-3861-5dc08377ab6a",
message:"士大夫但是",
extraData: {
nickname: "Superman",
role: 2,
sendTs: 1587974207200,
key1: 'value1',
key2: 'value2',
...sendExtraData
}
}
// Example:
client.on("recv-chat-msg", function(evt){
console.log(evt);
});
用户
peer-join
说明:该回调提示有远端用户 / 主播加入频道。
通信场景下,该回调提示有远端用户加入了频道,并返回新加入用户的 ID 和自定义用户属性;如果加入之前,已经有其他用户在频道中了,新加入的用户也会收到这些已有用户加入频道的回调。
直播场景下,该回调提示有主播加入了频道,并返回该主播的 ID 和自定义用户属性。如果在加入之前,已经有主播在频道中了,新加入的用户也会收到已有主播加入频道的回调。
该回调在如下情况下会被触发:
- 通信场景的远端用户 / 直播场景的远端主播调用 Client.joinChannel 方法加入频道。
- 直播场景的远端观众加入频道后调用 Client.setClientRole 将用户角色改变为主播。
- 通信场景的远端用户 / 直播场景的远端主播网络中断后重新加入频道。
- 直播场景的远端观众调用 Client.publish 方法时 sdk 会自动切换用户角色为主播。
回调参数 evt 结构:
{
isNowUser:true,
id: 'uid',
properties: {}
}
Note: isNowUser 如果为 true,则表示是在用户本人加入频道之后才加入频道的用户,如果为 false 则表示此用户在用户本人加入频道前就已经加入了频道。
// Example:
client.on("peer-join", function(evt) {
console.log("peer-join", evt);
});
peer-leave
说明:该回调通知应用有远端用户离线。
该回调在如下情况下会被触发:
- 通信场景的远端用户 / 直播场景的远端主播调用 Client.leaveChannel 方法离开频道。
- 直播场景的远端主播加入频道后调用 Client.setClientRole 将用户角色改变为观众。
- 通信场景的远端用户 / 直播场景的远端主播网络中断。
- 通信场景的远端用户 / 直播场景的远端主播被踢出频道。
- 通信场景的远端用户 / 直播场景的远端主播因为有相同的用户 id 进入频道而离开频道。
- 因为服务器主动关闭频道,踢出所有用户(通信场景的远端用户 / 直播场景的远端主播会收到回调)。
- 直播场景的远端主播调用 Clinet.unpublish 方法且没有任何本地流正在发布,则 sdk 会自动切换用户角色为观众。
回调参数 evt 结构:
{
id: 'uid', //id:string 用户 id
reason: 'Quit', //reason: string 用户离开的原因
reasoncode: 1, //reasoncode:number 离开的原因码
}
用户离线的原因:
- “Quit”: 用户调用了 Client.leaveChannel 主动离开频道。(reasoncode 为 1)
- “ServerTimeOut”: 因过长时间收不到对方数据包,超时掉线。注意:由于 SDK 使用的是不可靠通道,也有可能对方主动离开本方没收到对方离开消息而误判为超时掉线。(reasoncode 为 2)
- “KickedOut”: 用户被踢出频道。(reasoncode 为 3)
- “CommonUidJoin”: 因为有相同的用户 id 进入频道而离开频道。(reasoncode 为 4)
- “ServerCloseChannel”: 因为服务器主动关闭频道,踢出所有用户。(reasoncode 为 5)
- “BecomeAudience”: 用户角色从主播切换为观众。(reasoncode 为 6)
- “Unknown”: 未知原因离开频道。(reasoncode 为 0)
- “R2RChannelActiveClose”: 跨房间通道主动关闭 (reasoncode 为 8)
- “R2RChannelConnectLost”: 跨房间通道连接断开 (reasoncode 为 9)
- “Undefined”: 未定义的原因。(具体原因码为定义,reasoncode 的值根据收到的值为准)
Note: 在直播场景中,只有角色为主播的用户会触发该回调。
// Example:
client.on("peer-leave", function(evt) {
console.log("peer-leave", evt);
});
user-properties-update
说明:该回调通知 App 用户的自定义属性更新。
回调参数 evt 结构:
{
fromID: "fb4be6d4-4cfa-9d54-94b6-f58433baf88d",
id: "fb4be6d4-4cfa-9d54-94b6-f58433baf88d",
properties: {
publishstate: 0
}
toID: "__all",
ts: 1589875212
}
Note:
- 直播场景中调用 setProperty 接口,如果被改变者为观众,则不会通知自定义用户属性改变,即 Client.on(“user-properties-update”) 不触发回调。
- 直播场景中不建议观众调用 setProperty 接口。
// Example:
client.on("user-properties-update", function(evt) {
console.log("user-properties-update", evt);
});
peer-evicted
说明:该回调通知 App 用户本人被踢出频道。
回调参数 evt 结构:
{
fromID: 'uid',
reason: 'reason'
}
Note:
- fromID 为"__YSServer" 表示用户被服务器踢的,一般服务器踢人的原因是因为相同的 uid 加入频道导致的。
- 如果 fromID 为"__YSServer" 则 reason 为空字符串 “"。
// Example:
client.on("peer-evicted", function(evt) {
console.log("peer-evicted", evt);
});
设备
camera-device-changed
说明:该回调通知 App 有摄像头被添加或移除。
回调参数 evt 结构:
{
state: 'add',
devices:[{
kind: 'videoinput',
label: 'label',
deviceId: 'deviceid'
}]
}
// Example:
client.on("camera-device-changed", function(evt) {
console.log("camera-device-changed", evt.state, evt.devices);
});
microphone-device-changed
说明:该回调通知 App 有麦克风被添加或移除。
回调参数 evt 结构:
{
state: 'add',
devices: [{kind:"audioinput",label:"label",deviceId:"deviceid"}]
}
// Example:
client.on("microphone-device-changed", function(evt) {
console.log("microphone-device-changed", evt.state, evt.devices);
});
speaker-device-changed
说明:该回调通知 App 有扬声器被添加或移除。
回调参数 evt 结构:
{
state: 'add',
devices: [{
kind:'audiooutput',
label:'label',
deviceId:'deviceid'
}]
}
// Example:
client.on("speaker-device-changed", function(evt) {
console.log("speaker-device-changed", evt.state, evt.devices);
});