订阅/取消订阅远端的 Track
当一个房间中有自已以外的用户发布了 Track
后,就可以对这些 Track
发起订阅了。这里为了阐述方便,我们假设房间中有一名 userId
为 user1
的用户发布了 3 个 Track
。这 3 个 Track
的信息如下:
trackId | 类型 | tag | 隶属用户 |
---|---|---|---|
aaaaa | audio | audio_track | user1 |
bbbbb | video | camera_track | user1 |
ccccc | video | screen_track | user1 |
一个 audio Track 和两个 video Track(一个来自摄像头一个来自屏幕共享)。
订阅操作的前提,是在代码中拿到上述表格中的信息,所以我们首先介绍获取房间中 Track 信息的方法。
示例代码中的
myRoom
是指实例化并且已经加入房间后的房间 Session 对象,参见 加入房间
获取 TrackInfo
这个部分在我们之前的的 Demo 中详细介绍过,这里再简单说明下。首先,访问房间 Session 实例下的一些成员可以获取当前房间中的 TrackInfo
列表。然后通过 监听事件
的方式可以感知到房间中 TrackInfo
列表是否发生了变化。以这些为基础就能实时获取房间的 TrackInfo
列表。
// 房间当前的 TrackInfo 列表
const currentTrackInfoList = myRoom.trackInfoList;
// 房间当前的用户列表
const users = myRoom.users;
for (const user of users) {
// 每个用户当前的 TrackInfo 列表
const userTrackInfoList = user.publishedTrackInfo;
}
myRoom.on("track-add", trackInfoList => {
// 房间里有新的 Track 发布
console.log("new trackInfo", trackInfoList);
});
myRoom.on("track-remove", trackInfoList => {
// 房间里有 Track 取消发布
console.log("track unpublish", trackInfoList);
});
关于事件使用的具体细节,可以参考 监听事件 中的说明。关于房间中具体的事件列表,可以参考 TrackModeSession。
发起订阅
当我们拿到 TrackInfo
后,就可以发起订阅操作来获取相应的 Track
对象了。这里我们以上文中那 3 个 TrackInfo
为基础,订阅除了屏幕共享以外的两路音视频轨。代码中的 trackInfoList
就是指上文的 3 个 TrackInfo
。
// 过滤 tag 为 screen_track 的 TrackInfo
const filterTrackInfoList = trackInfoList.filter(info => info.tag !== "screen_track");
// 取出每个 TrackInfo 的 trackId 当作参数发起订阅
const tracks = await myRoom.subscribe(filterTrackInfoList.map(info => info.trackId));
返回的 tracks
就是 Track
对象列表,对应相应的 TrackInfo
,你可以访问 Track
的 info
来查看它的 TrackInfo
。它和采集操作返回的 Track
是同属一个类,所以使用方法相同,直接调用 play
即可播放。
mute 远端音频
设置 mute 为 true 后将无法听到远端的声音。这里的 mute
对于音频 Track,就是我们常说的 静音
。
myRoom.muteRemoteAudio(true);
取消订阅
当成功订阅获取 Track
之后,就可以选择这些 Track
来取消订阅了,这里我们接着上面的步骤,将我们刚刚订阅的 视频轨 取消订阅,音频轨保持不动。
// 从刚刚订阅返回的 tracks 中找到视频轨
const videoTrack = tracks.find(track => track.info.kind === "video");
// 传入 trackId,取消订阅,注意参数是一个列表
await myRoom.unsubscribe([videoTrack.info.trackId]);
取消订阅操作完成后,SDK 会自动释放相应的媒体对象。