2024/10/17 14:17:33
跨频道媒体流转发
在实时互动场景下,跨频道媒体流转发功能可实现主播角色的媒体流从源频道同时转发进多个目标频道,其中:
- 所有主播发布并接收彼此的音视频流,进行跨频道实时互动
- 观众可以接收到所有主播的音视频流,同时观看多位主播互动
该功能因其实时性和互动性,能够丰富直播玩法,尤其适用于连麦 PK、在线合唱等直播场景,为观众带来更好的观看体验的同时,也为主播带来更多的流量和收益。
信息
跨频道媒体流享受声网每月一万分钟免费政策。超出免费额度的部分,计费详情请参考跨频道媒体流转发计费。
前提条件
在开始前,请确保满足以下条件:
实现步骤
参考如下流程图实现相关代码逻辑:
1. 开始跨频道媒体流转发
加入频道后,调用 startOrUpdateChannelMediaRelay
配置源频道和目标频道信息,开始转发媒体流。示例代码如下:
C++
// 配置源频道信息
ChannelMediaInfo *m_srcInfo = new ChannelMediaInfo;
m_srcInfo->channelName = new char[szChannelId.size() + 1];
strcpy_s(const_cast<char *>(m_srcInfo->channelName), szChannelId.size() + 1,
szChannelId.data());
// 注意 Token 与用户加入源频道时的 Token 不同,需要用源频道名和 uid = 0 重新生成
m_srcInfo->token = APP_TOKEN;
// 推荐将源频道的 uid 设为 0,由 SDK 随机分配一个 uid
m_srcInfo->uid = 0;
// 配置目标频道信息
int nDestCount = m_vecChannelMedias.size();
ChannelMediaInfo *lpDestInfos = new ChannelMediaInfo[nDestCount];
for (int nIndex = 0; nIndex < nDestCount; nIndex++) {
lpDestInfos[nIndex].channelName = m_vecChannelMedias[nIndex].channelName;
lpDestInfos[nIndex].token = m_vecChannelMedias[nIndex].token;
// 你可以将 uid 设为 0,由 SDK 随机分配一个 uid,或自行指定
// uid,并确保其与目标频道中的所有 uid 不同
lpDestInfos[nIndex].uid = m_vecChannelMedias[nIndex].uid;
}
ChannelMediaRelayConfiguration cmrc;
cmrc.srcInfo = m_srcInfo;
cmrc.destInfos = lpDestInfos;
cmrc.destCount = nDestCount;
int ret = 0;
// 开始跨频道媒体流转发
ret = m_rtcEngine->startOrUpdateChannelMediaRelay(cmrc);
2. 更新媒体流转发的频道
成功调用 startOrUpdateChannelMediaRelay
后,如需将流转发到多个目标频道,或退出当前的转发频道,可以再次调用该方法添加或移除转发的目标频道。
信息
更新后的配置会全量替换掉之前的配置。
3. 暂停/恢复转发媒体流
开始跨频道转发媒体流后,调用 pauseAllChannelMediaRelay
可以暂停向所有目标频道转发媒体流。示例代码如下:
C++
m_rtcEngine->pauseAllChannelMediaRelay();
暂停跨频道媒体流转发后,调用 resumeAllChannelMediaRelay
即可恢复向所有目标频道转发媒体流。示例代码如下:
C++
m_rtcEngine->resumeAllChannelMediaRelay();
4. 停止跨频道媒体流转发
成功开始跨频道媒体流转发后,可以调用 stopChannelMediaRelay
停止转发媒体流,一经停止,主播会退出所有目标频道。示例代码如下:
C++
m_rtcEngine->stopChannelMediaRelay();
m_lstInfo.AddString(_T("stopChannelMediaRelay"));
m_btnStartMediaRelay.SetWindowText(CrossChannelStartMediaRelay);
信息
如果该方法调用失败,可以调用 leaveChannel
离开频道,跨频道媒体流转发会自动停止。
5. 监听跨频道媒体流状态
在跨频道媒体流转发过程中,SDK 会通过 onChannelMediaRelayStateChanged
回调报告媒体流转发的状态,你可以参考状态码的含义实现相关的业务逻辑。示例代码如下:
C++
class CAgoraCrossChannelEventHandler : public IRtcEngineEventHandler {
virtual void onChannelMediaRelayStateChanged(
CHANNEL_MEDIA_RELAY_STATE state,
CHANNEL_MEDIA_RELAY_ERROR code) override {
if (m_hMsgHanlder)
::PostMessage(m_hMsgHanlder,
WM_MSGID(EID_CHANNEL_MEDIA_RELAY_STATE_CHNAGENED),
state, code);
}
};
主要的状态码、错误码及其对应的媒体流转发状态如下:
媒体流转发状态 | 状态码和错误码 |
---|---|
源频道开始向目标频道传输数据。 | RELAY_STATE_RUNNING (2) 和 RELAY_OK (0) |
跨频道媒体流转发出现异常。可根据错误码进行排查。 | RELAY_STATE_FAILURE (3) |
已停止媒体流转发。 | RELAY_STATE_IDLE (0) 和 RELAY_OK (0) |
参考信息
开发注意事项
- 在直播场景中,只有角色为主播的用户才能调用
startOrUpdateChannelMediaRelay
开始跨频道媒体流转发。 startOrUpdateChannelMediaRelay
必须在成功加入频道后调用,否则会报错。- 一个频道内可以有多个主播转发媒体流,一个主播最多可以将媒体流转发至 6 个目标频道。
- 该功能不支持 String 型
uid
,如需使用跨频道连麦功能,则要在普通连麦中也使用 Int 型uid
,否则跨频道连麦功能无法正常使用。