功能描述
在社交娱乐等业务场景中,为了增强趣味性和互动性,经常会设计一些主播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 时序图实现相关代码逻辑:
示例代码
ChannelMediaInfo *lpSrcinfo = new ChannelMediaInfo;
lpSrcinfo->channelName = nullptr;
lpSrcinfo->token = nullptr;
lpSrcinfo->uid = 0;
ChannelMediaInfo *lpDestInfos = NULL;
int nDestCount = arrayDestInfos.size();
for(int nIndex = 0; nIndex < nDestCount; nIndex++) {
std::string strChannelName = arrayDestInfos[nIndex]["channelName"].asString();
std::string strtoken = arrayDestInfos[nIndex]["token"].asString();
uid_t uid = arrayDestInfos[nIndex]["uid"].asUInt();
lpDestInfos[nIndex].channelName = new char[strChannelName.length() + 1];
lpDestInfos[nIndex].token = new char[strtoken.length() + 1];
strcpy_s((char*)lpDestInfos[nIndex].channelName,strChannelName.length() + 1,strChannelName.c_str());
strcpy_s((char*)lpDestInfos[nIndex].token,strtoken.length() + 1,strtoken.c_str());
lpDestInfos[nIndex].uid = uid;
}
ChannelMediaRelayConfiguration cmrc;
cmrc.srcInfo = lpSrcinfo;
cmrc.destInfos = lpDestInfos;
cmrc.destCount = nDestCount;
int ret = 0;
// 设置要加入的远端频道信息
ret = m_lpArEngine->startChannelMediaRelay(cmrc);
ChannelMediaInfo *lpUpdateDestInfos = new ChannelMediaInfo;
lpUpdateDestInfos->channelName = "test";
lpUpdateDestInfos->token = nullptr;
lpUpdateDestInfos->uid = "0";
cmrc.destInfos = lpUpdateDestInfos;
cmrc.destCount = 1;
// 设置要更新的远端频道信息
ret = m_lpArEngine->updateChannelMediaRelay(cmrc);
updateChannelMediaRelay
方法需在 startChannelMediaRelay
后调用。
API 参考
startChannelMediaRelay
updateChannelMediaRelay
stopChannelMediaRelay
onChannelMediaRelayStateChanged
onChannelMediaRelayEvent
开发注意事项
-
该功能最多支持将媒体流转发至 4 个目标频道。转发过程中,如果想添加或删除目标频道,可以调用
updateChannelMediaRelay
方法。 -
在设置源频道信息时,请确保
uid
必须为空字符串“”,且用于生成 token 的uid
也必须为空字符串“”。 -
在成功调用
startChannelMediaRelay
方法后,如果想再次调用该方法,必须先调用stopChannelMediaRelay
方法退出当前的转发状态。