跨直播间连麦

最近更新时间:2022-09-20 05:17:40

功能描述

在社交娱乐等业务场景中,为了增强趣味性和互动性,经常会设计一些主播PK的互动场景,将不同房间的主播拉入同一个房间内进行游戏互动,同时各主播原有房间的观众还能同时观看到自己关注的主播表演并进行打赏等互动。

  • 主播的媒体流最大可以转发 4 个频道。
  • 频道中的所有主播可以看见彼此,并听到彼此的声音。
  • 频道中的观众可以看到所有主播,并听到主播的声音。

实现方法

跨频道连麦功能需要联系客服开通。

在实现跨频道连麦功能前,请确保已实现基本的音视频功能。

实现跨直播间连麦功能 API 调用顺序:

  • startChannelMediaRelay
  • updateChannelMediaRelay
  • stopChannelMediaRelay

跨频道流媒体转发后,SDK 会给予相应的回调:

  • onChannelMediaRelayStateChanged
  • onChannelMediaRelayEvent

你可以参考如下状态码或事件码的含义实现相关的业务逻辑:

状态码事件码媒体流转发状态
RELAY_STATE_RUNNING(2) 和 RELAY_OK(0)RELAY_EVENT_PACKET_SENT_TO_DEST_CHANNEL(4)源频道开始向目标频道传输数据
RELAY_STATE_FAILURE(3)/跨频道媒体流转发出现异常。可以参考 error 参数中报告的出错原因进行问题排查
RELAY_STATE_IDLE(0) 和 RELAY_OK(0)/已停止媒体流转发

一个频道内可以有多个主播转发媒体流。哪个主播调用 startChannelMediaRelay 方法,SDK 就转发哪个主播的流。 跨频道连麦中,如果目标频道的主播掉线或离开频道,源频道的主播会收到 onUserOffline 回调。

API 调用时序

参考如下 API 时序图实现相关代码逻辑:

示例代码

// 初始化引擎
engine = RtcEngine.create(getApplicationContext(), APPID, IRtcRngineEventHandler);

...

// 将用户填入的目标频道名赋值给 destChannelName
String destChannelName = et_channel_ex.getText().toString();
if(destChannelName.length() == 0){
  Log("Destination channel name is empty!");
}

// 配置源频道信息,其中 channelName 使用用户填入的源频道名,myUid 需要填为 ""
// 注意 sourceChannelToken 和用户加入源频道时的 Token 不一致,需要用 uid = "0" 和源频道名重新生成
ChannelMediaInfo srcChannelInfo = new ChannelMediaInfo(et_channel.getText().toString(), sourceChannelToken, myUid);
ChannelMediaRelayConfiguration mediaRelayConfiguration = new ChannelMediaRelayConfiguration();
mediaRelayConfiguration.setSrcChannelInfo(srcChannelInfo);

// 配置目标频道信息,其中 destChannelName 使用用户填入的目标频道名,myUid 填入用户在目标频道内的用户名
ChannelMediaInfo destChannelInfo = new ChannelMediaInfo(destChannelName, destChannelToken, myUid);
mediaRelayConfiguration.setDestChannelInfo(destChannelName, destChannelInfo);

// 调用 startChannelMediaRelay 开始跨频道媒体流转发
engine.startChannelMediaRelay(mediaRelayConfiguration);

// 调用 stopChannelMediaRelay 停止跨频道媒体流转发
engine.stopChannelMediaRelay();

updateChannelMediaRelay方法需在 startChannelMediaRelay 后调用。

API 参考