CloudHub 文档中心
下载中心 文档中心

RTC 实时音视频


CloudHub JSSDK

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 可能值如下:

// 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:

  1. 收到该回调时 SDK 已自动离开频道。
  2. 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:

// 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:

// 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 有以下值

可以参考: 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 有以下值

可以参考: 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:

// Example:

client.on("publish-permission", function(evt) {
    console.log("publish-permission", evt);
})

subscribe-permission

说明:该回调通知 App 是否有订阅权限。

回调参数 evt 结构:

{
    hasPermission: true,
}

Note:

// 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 有以下几种情况:

Note:

// 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 有以下值

// 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 种:

回调参数 evt 结构:

{
    curState:"CONNECTING",
    prevState:"CONNECTED"
}

Note:

// 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 和自定义用户属性。如果在加入之前,已经有主播在频道中了,新加入的用户也会收到已有主播加入频道的回调。

该回调在如下情况下会被触发:

回调参数 evt 结构:

{
    isNowUser:true,
    id: 'uid',
    properties: {}
}

Note: isNowUser 如果为 true,则表示是在用户本人加入频道之后才加入频道的用户,如果为 false 则表示此用户在用户本人加入频道前就已经加入了频道。

// Example:
client.on("peer-join", function(evt) {
    console.log("peer-join", evt);
});

peer-leave

说明:该回调通知应用有远端用户离线。

该回调在如下情况下会被触发:

回调参数 evt 结构:

{
    id: 'uid', //id:string 用户 id 
    reason: 'Quit', //reason: string 用户离开的原因 
    reasoncode: 1, //reasoncode:number 离开的原因码 
}

用户离线的原因:

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:

// Example:
client.on("user-properties-update", function(evt) {
    console.log("user-properties-update", evt);
});

peer-evicted

说明:该回调通知 App 用户本人被踢出频道。

回调参数 evt 结构:

{
    fromID: 'uid',
    reason: 'reason'
}

Note:

// 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);
});