适用场景
直播间里,为了增进直播气氛、快速吸粉,主播可以邀请其他直播间的主播进行连麦互动或在线 PK。连麦直播间内的观众可以同时收听或观看多个主播互动音视频内容,能够增强互动直播的趣味性。


方案原理
服务端启动多个混流转推任务,每个转推任务都会拉起一个 Agent 机器人用户进入己方 TRTC 房间进行拉流,同时会拉起一个或多个 Feed 机器人用户将混合的音视频流回推到其他参与跨房 PK 连麦的 TRTC 房间。这样不同房间里的用户就可以通过订阅其他房间混流回推的音视频流,从而实现跨房 PK 连麦。


实现流程
实时互动跨房连麦
1. 步骤一:房间 A 主播向房间 B 主播和房间 N 主播发起跨房 PK 请求(业务信令)。
2. 步骤二:房间 B 主播和房间 N 主播同意跨房 PK 请求(业务信令)。
3. 步骤三:业务后台同时启动 N 个混流回推房间任务 StartPublishCdnStream。
任务一:A_Agent 机器人接收 A 房间主播媒体流,经 TRTC 后台混流后由 A_Feed 机器人回推到 B 房间和 N 房间。
任务二:B_Agent 机器人接收 B 房间主播媒体流,经 TRTC 后台混流后由 B_Feed 机器人回推到 A 房间和 N 房间。
任务 N:N_Agent 机器人接收 N 房间主播媒体流,经 TRTC 后台混流后由 N_Feed 机器人回推到 A 房间和 B 房间。
4. 步骤四:房间 A、房间 B、房间 N 的用户互相拉取房间中混流回推的音视频流,开始进行跨房 PK。
5. 步骤五:跨房 PK 结束,业务后台通过 TaskId 停止 N 个混流回推房间任务 StopPublishCdnStream。
注意:
本方案最多支持 11 个房间同时进行跨房 PK 连麦,每个房间最多支持 16 个主播同时参与连麦。
机器人 ID 不能与房间内的普通用户 ID 冲突,否则会导致转推任务由于机器人用户被踢出 TRTC 房间而异常结束。
旁路直播跨房连麦
1. 业务后台在每个旁路直播间启动一个旁路转推 CDN 任务 StartPublishCdnStream。
2. 房间 A 主播向房间 B 主播和房间 N 主播发起跨房 PK 请求(业务信令)。
3. 房间 B 主播和房间 N 主播同意跨房 PK 请求(业务信令)。
4. 业务后台同时启动 N 个混流回推房间任务 StartPublishCdnStream。
任务一:A_Agent 机器人接收 A 房间主播媒体流,经 TRTC 后台混流后由 A_Feed 机器人回推到 B 房间和 N 房间。
任务二:B_Agent 机器人接收 B 房间主播媒体流,经 TRTC 后台混流后由 B_Feed 机器人回推到 A 房间和 N 房间。
任务 N:N_Agent 机器人接收 N 房间主播媒体流,经 TRTC 后台混流后由 N_Feed 机器人回推到 A 房间和 B 房间。
5. 房间 A、房间 B、房间 N 的用户互相拉取房间中混流回推的音视频流,开始进行跨房 PK。
6. 业务后台更新参与跨房 PK 的房间中原有的旁路转推 CDN 任务 UpdatePublishCdnStream,混合其他房间回推的音视频流。
7. 跨房 PK 结束,业务后台通过 TaskId 停止 N 个混流回推房间任务 StopPublishCdnStream。
8. 业务后台更新参与跨房 PK 的房间中原有的旁路转推 CDN 任务 UpdatePublishCdnStream,剔除其他房间回推的音视频流。
注意:
根据转推目标的不同,旁路转推 CDN 对应参数 McuPublishCdnParam,回推 TRTC 房间对应参数 McuFeedBackRoomParams。
若直播间为单主播直播场景,则在启动转推任务时可选择单流旁路转推 SingleSubscribeParams,从而节省混流转码费用。
示例代码
下面以纯音频场景为例,展示跨房 PK 混流回推房间任务的参数体示例。
{"SdkAppId": 1400000000,"RoomId": "A","RoomIdType": 1,"AgentParams": {"UserId": "A_Agent","UserSig": "eJwtjMEKgkAUAP9lz2Hv6b40oU...","MaxIdleTime": 50},"WithTranscoding": 1,"AudioParams": {"AudioEncode": {"Codec": 0,"SampleRate": 48000,"Channel": 2,"BitRate": 64}},"FeedBackRoomParams": [{"RoomId": "B","RoomIdType": 1,"UserId": "A_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."},{"RoomId": "N","RoomIdType": 1,"UserId": "A_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."}]}
{"SdkAppId": 1400000000,"RoomId": "B","RoomIdType": 1,"AgentParams": {"UserId": "B_Agent","UserSig": "eJwtjMEKgkAUAP9lz2Hv6b40oU...","MaxIdleTime": 50},"WithTranscoding": 1,"AudioParams": {"AudioEncode": {"Codec": 0,"SampleRate": 48000,"Channel": 2,"BitRate": 64}},"FeedBackRoomParams": [{"RoomId": "A","RoomIdType": 1,"UserId": "B_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."},{"RoomId": "N","RoomIdType": 1,"UserId": "B_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."}]}
{"SdkAppId": 1400000000,"RoomId": "N","RoomIdType": 1,"AgentParams": {"UserId": "N_Agent","UserSig": "eJwtjMEKgkAUAP9lz2Hv6b40oU...","MaxIdleTime": 50},"WithTranscoding": 1,"AudioParams": {"AudioEncode": {"Codec": 0,"SampleRate": 48000,"Channel": 2,"BitRate": 64}},"FeedBackRoomParams": [{"RoomId": "A","RoomIdType": 1,"UserId": "N_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."},{"RoomId": "B","RoomIdType": 1,"UserId": "N_Feed","UserSig": "eJwtzEELgkAUBOD-sldD3745..."}]}
注意: