跳到主要内容

房间事件回调

成功获取房间实例后,可以使用 registerRoomEventListener 添加监听器,在房间内远端用户的状态及资源变化时接收通知。

会议模式与直播模式下的房间实例类型有差异:

会议模式下监听房间事件

获取 RCRTCRoom 实例后,调用 registerRoomEventListener 注册房间事件监听器 IRoomEventListener。重复注册时会导致后者覆盖前者,仅最后一次注册有效。可以使用 registerRoomEventListener(null) 取消注册。

以下示例展示了部分回调方法。完整列表请参见 IRoomEventListener

 // 注册房间事件监听器,重复注册时,仅最后一次注册有效
room.registerRoomEventListener({
/**
* 本端被踢出房间时触发
* @description 被踢出房间可能是由于服务端超出一定时间未能收到 rtcPing 消息,所以认为己方离线。
* 另一种可能是己方 rtcPing 失败次数超出上限,故而主动断线
* @param byServer
* 当值为 false 时,说明本端 rtcPing 超时
* 当值为 true 时,说明本端收到被踢出房间通知
*/
onKickOff (byServer: boolean) {
// 当本地已获取资源后,需要调用 track.destroy() 销毁已获取的资源, track 为 RCMicphoneAudioTrack 或 RCCameraVideoTrack 类型实例
},
/**
* 接收到房间信令时回调,用户可通过房间实例的 `sendMessage(name, content)` 接口发送信令
* @param name 信令名
* @param content 信令内容
* @param senderUserId 发送者 Id
* @param messageUId 消息唯一标识
*/
onMessageReceive (name: string, content: any, senderUserId: string, messageUId: string) {
},
/**
* 监听房间属性变更通知
* @param name
* @param content
*/
onRoomAttributeChange (name: string, content: string) {
},
/**
* 发布者禁用/启用音频
* @param audioTrack RCRemoteAudioTrack 类实例
*/
onAudioMuteChange (audioTrack: RCRemoteAudioTrack) {
},
/**
* 发布者禁用/启用视频
* @param videoTrack RCRemoteVideoTrack 类实例对象
*/
onVideoMuteChange (videoTrack: RCRemoteVideoTrack) {
},
/**
* 房间内其他用户新发布资源时触发
* 如需获取加入房间之前房间内某个用户发布的资源列表,可使用 room.getRemoteTracksByUserId('userId') 获取
* @param tracks 新发布的音轨与视轨数据列表,包含新发布的 RCRemoteAudioTrack 与 RCRemoteVideoTrack 实例
*/
onTrackPublish (tracks: RCRemoteTrack[]) {
// 按业务需求选择需要订阅资源,通过 room.subscribe 接口进行订阅
const { code } = await room.subscribe(tracks)
if (code !== RCRTCCode.SUCCESS) {
console.log('资源订阅失败 ->', code)
}
},
/**
* 房间用户取消发布资源
* @param tracks 被取消发布的音轨与视轨数据列表
* @description 当资源被取消发布时,SDK 内部会取消对相关资源的订阅,业务层仅需处理 UI 业务
*/
onTrackUnpublish (tracks: RCRemoteTrack[]) {
},
/**
* 订阅的音视频流通道已建立, track 已可以进行播放
* @param track RCRemoteTrack 类实例
*/
onTrackReady (track: RCRemoteTrack) {
if (track.isAudioTrack()) {
// 音轨不需要传递播放控件
track.play()
} else {
// 视轨需要一个 video 标签才可进行播放
const element = document.createElement('video')
document.body.appendChild(element)
track.play(element)
}
},
/**
* 人员加入
* @param userIds 加入的人员 id 列表
*/
onUserJoin (userIds: string[]) {
},
/**
* 人员退出
* @param userIds
*/
onUserLeave (userIds: string[]) {
}
})

直播模式下主播用户监听房间事件

获取 RCLivingRoom 实例后,调用 registerRoomEventListener 注册房间事件监听器 IRoomEventListener。重复注册时会导致后者覆盖前者,仅最后一次注册有效。可以使用 registerRoomEventListener(null) 取消注册。

以下示例展示了部分回调方法。完整列表请参见 IRoomEventListener

// 注册房间事件监听器,重复注册时,仅最后一次注册有效
room.registerRoomEventListener({
/**
* 当本端被剔出房间
* @description 被踢出房间可能是由于服务端超出一定时间未能收到 rtcPing 消息,所以认为己方离线。
* 另一种可能是己方 rtcPing 失败次数超出上限,故而主动断线
* @param byServer
* 当值为 false 时,说明本端 rtcPing 超时
* 当值为 true 时,说明本端收到被踢出房间通知
* @param state 被踢出房间的原因
*/
onKickOff? (byServer: boolean, state?: RCKickReason): void
},
/**
* 接收到房间信令时回调,用户可通过房间实例的 `sendMessage(name, content)` 接口发送信令
* @param name 信令名
* @param content 信令内容
* @param senderUserId 发送者 Id
* @param messageUId 消息唯一标识
*/
onMessageReceive (name: string, content: any, senderUserId: string, messageUId: string) {
},
/**
* 监听房间属性变更通知
* @param name
* @param content
*/
onRoomAttributeChange (name: string, content: string) {
},
/**
* 房间用户禁用/启用音频
* @param audioTrack RCRemoteAudioTrack 类实例
*/
onAudioMuteChange (audioTrack: RCRemoteAudioTrack) {
},
/**
* 房间用户禁用/启用视频
* @param videoTrack RCRemoteVideoTrack 类实例对象
*/
onVideoMuteChange (videoTrack: RCRemoteVideoTrack) {
},
/**
* 房间内用户发布资源
* @param tracks 新发布的音轨与视轨数据列表,包含新发布的 RCRemoteAudioTrack 与 RCRemoteVideoTrack 实例
*/
async onTrackPublish (tracks: RCRemoteTrack[]) {
// 按业务需求选择需要订阅资源,通过 room.subscribe 接口进行订阅
const { code } = await room.subscribe(tracks)
if (code !== RCRTCCode.SUCCESS) {
console.log('资源订阅失败 ->', code)
}
},
/**
* 房间用户取消发布资源
* @param tracks 被取消发布的音轨与视轨数据列表
* @description 当资源被取消发布时,SDK 内部会取消对相关资源的订阅,业务层仅需处理 UI 业务
*/
onTrackUnpublish (tracks: RCRemoteTrack[]) {
},
/**
* 订阅的音视频流通道已建立, track 已可以进行播放
* @param track RCRemoteTrack 类实例
*/
onTrackReady (track: RCRemoteTrack) {
if (track.isAudioTrack()) {
// 音轨不需要传递播放控件
track.play()
} else {
// 视轨需要一个 video 标签才可进行播放
const element = document.createElement('video')
document.body.appendChild(element)
track.play(element)
}
},
/**
* 人员加入
* @param userIds 加入的人员 id 列表
*/
onUserJoin (userIds: string[]) {
},
/**
* 人员退出
* @param userIds
*/
onUserLeave (userIds: string[]) {
},
/**
* 房间内主播和观众切换身份(@rongcloud/plugin-rtc@5.2.0 新增)
* @description @rongcloud/plugin-rtc@5.2.0 及其之后,
* 如业务层未传入 onSwitchRole 回调,“房间内观众升级为主播”通过 onUserJoin 通知,“主播降级为房间内的观众”通过 onUserLeave 通知;
* 业务层传入 onSwitchRole 时,“房间内主播和观众切换身份”通过 onSwitchRole 通知,onUserJoin 和 onUserLeave 仅通知手动调用“加入或退出房间”的人员
* @param userId 用户 ID
* @param role 用户角色
* role 值为 RCRTCLiveRole.ANCHOR 时,代表房间内观众升级为主播
* role 值为 RCRTCLiveRole.AUDIENCE 时,代表主播降级为房间内的观众
*/
onSwitchRole (userId: string, role: RCRTCLiveRole) {
}
})

直播模式下观众角色用户监听房间事件

获取 RCAudienceLivingRoom 实例后,调用 registerRoomEventListener 注册观众房间事件监听器 IAudienceRoomEventListener。重复注册时会导致后者覆盖前者,仅最后一次注册有效。可以使用 registerRoomEventListener(null) 取消注册。

以下示例展示了部分回调方法。完整列表请参见 IAudienceRoomEventListener

// audienceRoom 为观众加入房间返回的 room
// 注册房间事件监听器,重复注册时,仅最后一次有效
audienceRoom.registerRoomEventListener({
/**
* 主播加入
* @param userIds 加入的主播 id 列表
*/
onAnchorJoin (userIds: string[]) {
},
/**
* 主播离开
* @param userIds 离开的主播 id 列表
*/
onAnchorLeave (userIds: string[]) {
},
/*
* 房间内直播合流资源发布
* @param track RCRemoteTrack 类实例
* * 房间类型以第一个加入房间用户设置的直播类型为准
* * 房间直播类型为 RCLivingType.AUDIO_VIDEO ,tracks 包含 RCRemoteAudioTrack 与 RCRemoteVideoTrack 实例
* * 直播类型为 RCLivingType.AUDIO , tracks 仅包含 RCRemoteAudioTrack 实例
* * 触发时机: 主播发布资源后
*/
onTrackPublish (tracks: RCRemoteTrack[]) {
},
/*
* 房间内直播合流资源取消发布
* @param track RCRemoteTrack 类实例
* * 触发时机: 全部主播退出房间(因资源为多个主播发布的合流资源,单个主播取消发布不会触发)
*/
onTrackUnpublish (tracks: RCRemoteTrack[]) {
},
/*
* 房间内主播资源发布
* @param track RCRemoteTrack 类实例
* * 触发时机: 主播发布资源后
*/
onAnchorTrackPublish (tracks: RCRemoteTrack[]){
},
/*
* 房间内主播资源取消发布
* @param track RCRemoteTrack 类实例
* * 触发时机: 主播取消发布资源后
*/
onAnchorTrackUnpublish (tracks: RCRemoteTrack[]){
},
/**
* 订阅的音视频流通道已建立, track 已可以进行播放
* @param track RCRemoteTrack 类实例
*/
onTrackReady (track: RCRemoteTrack) {
// 订阅的音视频轨道已连接,可以根据业务需求选择性播放
if (track.isAudioTrack()) {
// 音频播放无需传递组件
track.play()
} else {
// 此处的 videoNode 为 <video> 标签元素实例
track.play(videoNode)
}
}
})