远端用户流
在会议模式下,参会用户加入音视频房间后,如需观看他人画面或收听他人音频,需要主动**订阅(Subscribe)**其他用户已发布的音视频资源。
SDK 提供两套订阅与取消订阅的方式,适用于不同业务场景:
-
普通订阅、取消订阅方法:
subscribe
/unsubscribe
-
任务队列优化方法(SDK ≥ 5.4.4):
使用
addSubscribeTask
/addUnsubscribeTask
/addUpdateSubscribeListTask
支持任务队列及任务合并优化,适合高频订阅或取消订阅场景。
订阅资源的时机
订阅资源通常需要在以下两个时机进行:
-
加入房间成功后
加入房间成功会返回 RCRTCRoom 房间实例、房间内其他用户的 ID 及已发布的资源列表。此时可以立即订阅房间内已有的音视频资源。
-
房间内用户发布新资源时
加入房间后可通过 IRoomEventListener 事件监听器,监听
onTrackPublish
事件。当有用户发布新资源 时按需订阅。
示例代码
typescript
// 注册房间事件监听器,重复注册时,仅最后一次注册有效
room.registerRoomEventListener({
/**
* 房间内用户发布资源
* @param tracks 新发布的音轨与视轨数据列表,包含新发布的 RCRemoteAudioTrack 与 RCRemoteVideoTrack 实例
*/
async onTrackPublish (tracks: RCRemoteTrack[]) {
// 按业务需求选择需要订阅资源,通过 room.subscribe 接口进行订阅
const { code } = await room.subscribe(tracks)
if (code !== RCRTCCode.SUCCESS) {
console.log('资源订阅失败 ->', code)
}
},
/**
* 订阅的音视频流通道已建立, track 已可以进行播放
* @param track RCRemoteTrack 类实例
*/
onTrackReady (track: RCRemoteTrack) {
// 订阅的音视频轨道已连接,可以根据业务需求选择性播放
if (track.isAudioTrack()) {
// 音频播放无需传递组件
track.play()
} else {
// 此处的 videoNode 为 <video> 标签元素实例
track.play(videoNode)
}
}
})
订阅资源
调用 subscribe 方法订阅音视轨资源。
视频轨道支持大小流机制:
- 若远端用户已发布大小流,可通过
subTiny
参数选择订阅小流以节省下行带宽; - 若对方未发布小流,即使设置
subTiny: true
,依然会接收大流。
接口
typescript
room.subscribe(tracks)
参数说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
tracks | RCLocalTrack[] 或者 IPublishAttrs[] | 是 | 音视频资源 |
示例代码
typescript
const { code } = await room.subscribe([
// 音频不支持大小流
audioTrack,
{
track: videoTrack,
subTiny: true // 订阅小流
}
])
取消订阅
调用 unsubscribe 方法取消订阅已订阅的音视频轨道。
接口
typescript
room.unsubscribe(tracks)
参数说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
tracks | RCRemoteTrack[] | 是 | 远端音视频资源。 |
示例代码
typescript
const { code } = await room.unsubscribe([audioTrack, videoTrack])
// 取消订阅完成后,业务层移除相关的 UI 信息即可