跨频道媒体流转发
在实时互动场景下,跨频道媒体流转发功能可实现主播角色的媒体流从源频道同时转发进多个目标频道,其中:
- 所有主播发布并接收彼此的音视频流,进行跨频道实时互动
- 观众可以接收到所有主播的音视频流,同时观看多位主播互动
该功能因其实时性和互动性,能够丰富直播玩法,尤其适用于连麦 PK、在线合唱等直播场景,为观众带来更好的观看体验的同时,也为主播带来更多的流量和收益。
跨频道媒体流享受声网每月一万分钟免费政策。超出免费额度的部分,计费详情请参考跨频道媒体流转发计费。
前提条件
在开始前,请确保满足以下条件:
实现步骤
参考如下流程图实现相关代码逻辑:
1. 开始跨频道媒体流转发
加入频道后,调用 StartOrUpdateChannelMediaRelay 配置源频道和目标频道信息,开始转发媒体流。示例代码如下:
private void OnStartButtonClick()
{
ChannelMediaRelayConfiguration config = new ChannelMediaRelayConfiguration();
// 配置源频道信息
config.srcInfo = new ChannelMediaInfo
{
channelName = this._appIdInput.channelName,
// 推荐将源频道的 uid 设为 0,由 SDK 随机分配一个 uid
uid = 0,
// 注意 Token 与用户加入源频道时的 Token 不同,需要用源频道名和 uid = 0 重新生成
token = this._appIdInput.token
};
// 配置目标频道信息,最多支持将媒体流转发至 6 个目标频道
config.destInfos = new ChannelMediaInfo[1];
config.destInfos[0] = new ChannelMediaInfo
{
channelName = this._appIdInput.channelName + "_2",
// 你可以将 uid 设为 0,由 SDK 随机分配一个 uid,或自行指定 uid,并确保其与目标频道中的所有 uid 不同
uid = 0,
token = this._appIdInput.token
};
config.destCount = 1;
// 开始跨频道媒体流转发
var nRet = RtcEngine.StartOrUpdateChannelMediaRelay(config);
this.Log.UpdateLog("StartOrUpdateChannelMediaRelay nRet:" + nRet + " new ChannelName: " + this._appIdInput.channelName + "_2");
}
2. 更新媒体流转发的频道
成功调用 StartOrUpdateChannelMediaRelay 后,如需将流转发到多个目标频道,或退出当前的转发频道,可以再次调用该方法添加或移除转发的目标频道。
更新后的配置会全量替换掉之前的配置。
3. 暂停/恢复转发媒体流
开始跨频道转发媒体流后,调用 PauseAllChannelMediaRelay 可以暂停向所有目标频道转发媒体流。示例代码如下:
private void onPauseAllButtonClick()
{
var nRet = RtcEngine.PauseAllChannelMediaRelay();
this.Log.UpdateLog("onPauseAllButtonClick nRet:" + nRet);
}
暂停跨频道媒体流转发后,调用 ResumeAllChannelMediaRelay 即可恢复向所有目标频道转发媒体流。示例代码如下:
private void OnResumeAllButtonClick()
{
var nRet = RtcEngine.ResumeAllChannelMediaRelay();
this.Log.UpdateLog("OnResumeAllButtonClick nRet:" + nRet);
}
4. 停止跨频道媒体流转发
成功开始跨频道媒体流转发后,可以调用 StopChannelMediaRelay 停止转发媒体流,一经停止,主播会退出所有目标频道。示例代码如下:
private void OnStopButtonClick()
{
var nRet = RtcEngine.StopChannelMediaRelay();
this.Log.UpdateLog("OnStopButtonClick nRet:" + nRet);
}
如果该方法调用失败,可以调用 LeaveChannel 离开频道,跨频道媒体流转发会自动停止。
5. 监听跨频道媒体流状态
在跨频道媒体流转发过程中,SDK 会通过 OnChannelMediaRelayStateChanged 回调报告媒体流转发的状态,你可以参考状态码的含义实现相关的业务逻辑。示例代码如下:
public override void OnChannelMediaRelayStateChanged(int state, int code)
{
_channelMediaRelay.Log.UpdateLog(string.Format("OnChannelMediaRelayStateChanged state: {0}, code: {1}", 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,否则跨频道连麦功能无法正常使用。
示例项目
声网提供了开源的跨频道媒体流转发示例项目供你参考,你可以前往下载或查看其中的源代码。