跨房间转发媒体流,指可见用户的媒体流可以同时转发到多个 RTC 房间。转发目标房间的数量在 RTC 侧没有限制。 本功能适用于以下场景,观众在原来的房间中就能够接收到来自其他房间主播的媒体流。
主播连麦 PK
在线 K 歌合唱
子母直播间
自 Native SDK v3.34 起,本功能在 Native 端可用。
自 Web SDK v4.54 起,本功能在 Web 端可用。
注意
微信小程序端 SDK 不支持本功能。
转推流:跨房间转发的媒体流
源房间:发送转推流的房间
目标房间:转推流到达的房间
说明
以下示例代码以 Web RTC SDK 为例,参考对应平台的 API 文档获取更多信息。
import VERTC, { ForwardStreamState } from '@volcengine/rtc';
// 创建引擎实例
const engine = VERTC.createEngine('appid');
// 加入房间
await engine.joinRoom('roomId_token', 'roomId', { userId: 'userid' });
typescript注意
startForwardStreamToRooms 中所传入的 token 是与目标房间相对应的 token,而非本房间 token。stopForwardStreamToRooms 前,仅可调用一次 startForwardStreamToRooms。// 管理目标房间列表
const targetRoomList: string[] = [];
// 开启跨房间转发媒体流
const startResult = await engine.startForwardStreamToRooms([
{ roomId: 'targetRoomIdA', token: 'targetRoomIdA_token' },
// 可以同时指定多个目标房间
{ roomId: 'targetRoomIdB', token: 'targetRoomIdB_token' }
]);
// 处理调用结果
startResult.forEach(item => {
if (item.state === ForwardStreamState.FORWARD_STREAM_STATE_SUCCESS) {
// 保存成功的目标房间
targetRoomList.push(item.roomId);
} else {
// 根据错误码进行对应处理
console.error(item.error);
}
});
typescript注意
updateForwardStreamToRooms 时不传入任何参数,则将停止所有已转发的目标房间流。此时仍需要调用 stopForwardStreamToRooms 后才可以再次调用 startForwardStreamToRooms。updateForwardStreamToRooms 的返回结果中。// 更新跨房间转发媒体流的目标房间列表
const updateResult = await engine.updateForwardStreamToRooms([
// 列表中不包含 targetRoomIdA,会停止该房间的转发媒体流
// targetRoomIdB 在之前的目标房间列表中,会更新对应的 token
{ roomId: 'targetRoomIdB', token: 'targetRoomIdB_new_token' },
// targetRoomIdC 不在之前的目标房间列表中,会开启向该房间转发媒体流
{ roomId: 'targetRoomIdC', token: 'targetRoomIdC_token' }
]);
// 处理调用结果
updateResult.forEach(item => {
if (item.state === ForwardStreamState.FORWARD_STREAM_STATE_SUCCESS) {
if (!['targetRoomIdB', 'targetRoomIdC'].includes(item.roomId)) {
// 不在请求列表中,但在返回结果中的应当删除
targetRoomList.splice(targetRoomList.indexOf(item.roomId), 1);
} else if (!targetRoomList.includes(item.roomId)) {
// 不在已有房间中,需要新增
targetRoomList.push(item.roomId);
}
} else {
// 根据错误码进行对应处理
console.error(item.error);
}
});
typescript注意
在调用 resumeForwardStreamToAllRooms 恢复媒体流转发前,仅可调用一次 pauseForwardStreamToAllRooms。
// 暂停跨房间转发媒体流的目标房间列表
await engine.pauseForwardStreamToAllRooms();
// 恢复跨房间转发媒体流的目标房间列表
const result = await engine.resumeForwardStreamToAllRooms();
// 处理调用结果
result.forEach(item => {
if (item.state !== ForwardStreamState.FORWARD_STREAM_STATE_SUCCESS) {
// 根据错误码进行对应处理
console.error(item.error);
}
});
typescript// 停止跨房间转发媒体流的目标房间列表
await engine.stopForwardStreamToRooms();
typescriptfunction onForwardError(info) {
console.error(info);
}
engine.on(EngineEventsTypes.onForwardStreamError, onForwardError);
typescript参考以下顺序,调用 API 实现此功能:
请勿向开启音频选路的房间转发媒体流,该媒体流可能无法被播放。
如果媒体流转发过程中,用户切换为不可见,媒体流转发也将停止。
转发媒体流至目标房间后,将会触发以下回调:onUserJoin、onUserLeave、onUserPublishStream/onUserPublishScreen、onUserUnpublishStream/onUserUnpublishScreen。
转发媒体流至目标房间后,用户调用多房间接口进入任意目标房间,将会再次触发以下回调:onUserJoin、onUserLeave、onUserPublishStream/onUserPublishScreen、onUserUnpublishStream/onUserUnpublishScreen。
使用转发媒体流功能并不会产生额外的费用,与其他音视频通话遵循相同的计费原则,详见计费规则。