跨房媒体转发
本部分介绍跨房媒体转发的使用以及使用场景
跨房媒体转发允许主播不离开自己的所在的房间,仅通过信令的操作,转发自己的音视频到其他的房间。七牛 RTCSDK 支持同时转发多路至多个房间(具体按照设备状况以及网络状况决定)。依赖此功能,可以很方便的实现连麦,小班课等业务场景。
跨房媒体转发使用
使用前注意事项
请注意当前跨房功能仅对房间类型为直播,且角色为主播的场景下才能使用。请确保加入房间前调用以下接口:
QNRTCEngine.setRoomType(QNRoomType.LIVE_BROADCASTING);
QNRTCEngine.setClientRole(QNClientRole.BROADCASTER);
对于以下几种情况:
- 已加入房间,且房间类型为
QNRoomType.COMMUNICATION
,则必须退出房间后以QNRoomType.LIVE_BROADCASTING
的房间类型加入,才可使用 - 已加入房间,且房间类型为
QNRoomType.LIVE_BROADCASTING
,但是角色为QNClientRole.AUDIENCE
,则不需要退出房间,执行以下步骤即可:- 调用
QNRTCEngine.setClientRole(QNClientRole.BROADCASTER)
; - 等待
QNRTCEngineEventListener.onClientRoleChanged(QNClientRole clientRole)
触发,且角色成功切换为QNClientRole.BROADCASTER
。 - 调用跨房媒体转发 API。
- 调用
开启跨房媒体转发
通过 QNRTCEngine#startMediaRelay
接口开启跨房媒体转发,在 QNRTCEngineEventListener.onMediaRelayStateChanged
中收到回调,具体回调状态参考 QNMediaRelayState
,成功会返回 Success
,否则返回其他值。
public boolean startMediaRelay(QNMediaRelayConfiguration configuration);
configuration,跨房媒体转发配置项
QNMediaRelayConfiguration.getSourceInfo() 目前暂不使用,可以为空 QNMediaRelayConfiguration.getDestinationInfoList() 表示媒体将要转发的目标房间列表,支持同时转发多个房间
例:
QNMediaRelayInfo sourceInfo = new QNMediaRelayInfo(roomName, token);
QNMediaRelayConfiguration configuration = new QNMediaRelayConfiguration(sourceInfo);
// 添加目标房间
QNMediaRelayInfo destInfo1 = new QNMediaRelayInfo(destRoomName1, destRoomRelayToken1);
QNMediaRelayInfo destInfo2 = new QNMediaRelayInfo(destRoomName2, destRoomRelayToken2);
configuration.getDestinationInfoList().add(destInfo1);
configuration.getDestinationInfoList().add(destInfo2);
engine.startMediaRelay(configuration);
class QNRTCEngineEventListener {
void onMediaRelayStateChanged(Map<String, QNMediaRelayState> stateMap) {
for(Map.Entry<String, QNMediaRelayState> entry : stateMap.entrySet()) {
Log.i("MediaRelay", "房间="+entry.getKey() + ",跨房状态="+entry.getValue().name());
}
}
}
更新跨房媒体转发
通过 QNRTCEngine#updateMediaRelay
接口更新跨房媒体转发,在 QNRTCEngineEventListener.onMediaRelayStateChanged
中收到回调
注意此接口中的 configuration
为全量更新,如已经开启的跨房的目标房间未被包含,则会被停止
public boolean updateMediaRelay(QNMediaRelayConfiguration configuration);
configuration,跨房媒体转发配置项
QNMediaRelayConfiguration.getSourceInfo() 目前暂不使用,可以为空 QNMediaRelayConfiguration.getDestinationInfoList() 表示媒体将要转发的目标房间列表,支持同时转发多个房间
例:同开启跨房媒体转发
停止跨房媒体转发
通过 QNRTCEngine#stopMediaRelay
接口停止跨房媒体转发,所有已开启的跨房行为将被停止,在 QNRTCEngineEventListener.onMediaRelayStateChanged
中收到回调
public boolean stopMediaRelay();
事件通知
- 主动跨房的主播 A,可在
QNRTCEngineEventListener.onMediaRelayStateChanged
中收到当前跨房请求的状态更新 - 被跨房的主播 B,当主播 A 跨房成功之后,会触发
QNRTCEngineEventListener.onRemoteUserJoined
等用户加入,离开,发布音视频等回调。
使用场景
连麦 pk
旧版方案
当前连麦 pk 方案为主播 A 先退出当前房间,然后再加入主播 B 的房间,连麦完成后需要再切回原房间。中间过程比较复杂,涉及了重复进出房间等比较复杂的操作,客户端需要保存较多的状态,容易出错。
跨房媒体转发方案
使用跨房媒体转发方案,可以很方便的解决连麦 pk 这类场景的需求。 主播 A 不再需要离开自己的房间,只需通过以下步骤即可:
- 业务协商,主播 A 通过
RTCSDK
自定义消息或者业务服务器长连接向主播 B 发送连麦请求,如果请求通过,则进行下一步 - 主播 A 调用
QNRTCEngine#startMediaRelay
,主播 B 收到主播 A 加入房间和发布音视频等一系列消息后,再使用setMergeStreamLayouts
方法更新合流布局即可。 - 主播 B 操作同主播 A。
- 连麦结束后,各自调用
QNRTCEngine#stopMediaRelay
停止跨房,并调用removeMergeStreamLayouts
移除连麦布局。 - 结束