功能描述
在社交娱乐等业务场景中,为了增强趣味性和互动性,经常会设计一些主播PK的互动场景,将不同房间的主播拉入同一个房间内进行游戏互动,同时各主播原有房间的观众还能同时观看到自己关注的主播表演并进行打赏等互动。
- 主播的媒体流最大可以转发 4 个频道。
- 频道中的所有主播可以看见彼此,并听到彼此的声音。
- 频道中的观众可以看到所有主播,并听到主播的声音。
实现方法
跨频道连麦功能需要联系客服开通。
在实现跨频道连麦功能前,请确保已实现基本的音视频功能。
实现跨直播间连麦功能 API 调用顺序:
跨频道流媒体转发后,SDK 会给予相应的回调:
状态码 | 事件码 | 媒体流转发状态 |
---|---|---|
ARChannelMediaRelayStateRunning(2) 和 ARChannelMediaRelayErrorNone(0) | ARChannelMediaRelayEventSentTo-DestinationChannel(4) | 源频道开始向目标频道传输数据 |
ARChannelMediaRelayStateFailure(3) | / | 跨频道媒体流转发出现异常。可以参考 error 参数中报告的出错原因进行问题排查 |
ARChannelMediaRelayStateIdle(0) 和 ARChannelMediaRelayErrorNone(0) | / | 已停止媒体流转发 |
一个频道内可以有多个主播转发媒体流。哪个主播调用 startChannelMediaRelay
方法,SDK 就转发哪个主播的流。
跨频道连麦中,如果目标频道的主播掉线或离开频道,源频道的主播会收到 didOfflineOfUid
回调。
API 调用时序
参考如下 API 时序图实现相关代码逻辑:
示例代码
// 配置源频道信息,其中 channelName 使用默认值,即当前的频道名;uid 使用默认值 "0"
let config = ARChannelMediaRelayConfiguration()
// 请确保生成 sourceChannelToken 的 uid 为 "0"
config.sourceInfo = ARChannelMediaRelayInfo(token: sourceChannelToken)
// 配置目标频道信息
let destinationInfo = ARChannelMediaRelayInfo(token: destinationChannelToken)
config.setDestinationInfo(destinationInfo, forChannelName: destinationChannelName)
// 开始跨频道媒体流转发
rtcKit.startChannelMediaRelay(config)
// 停止跨频道媒体流转发
rtcKit.stopChannelMediaRelay()
// 使用 channelMediaRelayStateDidChange 回调监控跨频道媒体流的状态
func rtcEngine)(_ engine: ARtcEngineKit, channelMediaRelayStateDidChange state: ARChannelMediaRelayState, error: ARChannelMediaRelayError) {
LogUtils.log(message: "channelMediaRelayStateDidChange: \(state.rawVlue) error \(error.rawValue)", level: .info)
switch(state) {
case .running:
isRelaying = true
break
case .failure:
showAlert(message: "Media Relay Failed: \(error.rawValue)")
isRelaying = false
break
case .idle:
isRelaying = false
break
default:break
}
}
updateChannelMediaRelay
方法需在 startChannelMediaRelay
后调用。
API 参考
开发注意事项
-
该功能最多支持将媒体流转发至 4 个目标频道。转发过程中,如果想添加或删除目标频道,可以调用
updateChannelMediaRelay
方法。 -
该功能不支持 String 型用户 ID。
-
在设置源频道信息时,请确保
uid
必须为 "0",且用于生成 token 的uid
也必须为 "0"。 -
在成功调用
startChannelMediaRelay
方法后,如果想再次调用该方法,必须先调用stopChannelMediaRelay
方法退出当前的转发状态。