跨房间媒体流转发

更新时间: 2024/03/15 17:22:14

在 NERTC 直播场景的音视频房间中,跨房间媒体流转发功能可实现主播角色跨房间与其他主播实时交流互动,在娱乐场景下可实现跨直播间连麦效果。本文档为您介绍跨房间媒体流转发的实现方法。 直播场景中,主播角色的媒体流可以同时转发到多个房间中,实现主播跨房间与其他主播实时互动的场景。该功能称为跨房间媒体流转发,在娱乐场景下可实现跨直播间连麦、在线教育场景下可实现超级小班课场景。

跨房间媒体流转发成功后,源房间中的主播发布的媒体流会同步到其他指定房间中,房间中的所有主播都可以进行实时音视频互动,房间中的观众角色也可以接收到所有主播的音视频流。

注意事项

  • 该功能支持将媒体流转发至其他目标房间中,一个房间中可以有多个主播角色转发本人的媒体流。
  • 只有直播场景下的主播角色可以调用 startChannelMediaRelay 方法将本人的媒体流转发至其他房间中,否则会报错 kNERtcErrChannelMediaRelayPermissionDenied(30111)。
  • 在成功调用 startChannelMediaRelay 方法、开始跨房间转发媒体流后:
    • 如果想调整目标房间,例如添加或删除目标房间,可以调用 updateChannelMediaRelay 方法实现。
    • 如果想再次调用该方法,必须先调用 stopChannelMediaRelay 方法退出当前的转发状态。

实现方法

NERTC SDK 自 V4.3.0 版本开始支持跨房间媒体流转发功能,可以实现跨直播间连麦。

API 时序

实现步骤

  1. 主播角色加入直播场景的房间之后,通过 startChannelMediaRelay 开启跨直播间媒体流转发。

    • 此时需要通过参数 config 配置源房间、目标房间等信息。
    • 一个房间中可以有多个主播转发媒体流,需要跨房间连麦的主播可以在加入房间后随时调用此方法,此时 SDK 会转发该主播的媒体流,包括音频流、视频流与屏幕共享流等。
  2. 在跨房间媒体流转发的过程中,如果需要调整目标房间,例如添加或删除目标房间,可以调用 updateChannelMediaRelay 方法实现。

    您可以在调用该方法之前,通过 NERtcChannelMediaRelayConfiguration 中的 dest_infos 移除不需要的房间,再添加新的目标房间。

  3. 在跨房间媒体流转发过程中,SDK 会通过 onMediaRelayStateChangedonMediaRelayEvent 回调报告媒体流转发的状态和事件。

  4. 主播离开房间时,跨房间媒体流转发自动停止,您也可以在需要的时候随时调用 stopChannelMediaRelay 方法,此时主播会退出所有目标房间。

示例代码

c++/// 实例化config
std::shared_ptr<nertc::NERtcChannelMediaRelayConfiguration> media_relay_config_ = std::make_shared<nertc::NERtcChannelMediaRelayConfiguration>();
media_relay_config_->src_infos = nullptr;
media_relay_config_->dest_infos = nullptr;
media_relay_config_->dest_count = 2;

/// 设置源房间
char curRoom[128] = "163163";
nertc::NERtcChannelMediaRelayInfo* src_info = (nertc::NERtcChannelMediaRelayInfo*)malloc(sizeof(nertc::NERtcChannelMediaRelayInfo));
memset(src_info, 0, sizeof(nertc::NERtcChannelMediaRelayInfo));
media_relay_config_->src_infos = src_info;
memcpy_s((void*)src_info->channel_name, 128, curRoom, 128);
memcpy_s((void*)src_info->channel_token, 256, token_.c_str(), token_.size());
src_info->uid = cur_my_uid_;//cur_my_uid_ = 当前用户id

media_relay_config_->src_infos = src_info;

/// 比如要添加两个目标房间 ,房间数目必须与用户id数目统一
std::vector<int64_t> uids = {12345, 12346};
std::vector<std::string> cids = {8888, 9999}; 

nertc::NERtcChannelMediaRelayInfo* dst_info = (nertc::NERtcChannelMediaRelayInfo*)malloc(sizeof(nertc::NERtcChannelMediaRelayInfo) * uids.size());
memset(dst_info, 0, sizeof(nertc::NERtcChannelMediaRelayInfo) * uids.size());
for (int index = 0; index < uids.size(); ++index) {
    std::string str_cname = StringToUTF8(cids[index]);
    memcpy_s((void*)((dst_info + index)->channel_name), 128, str_cname.c_str(), str_cname.size());
    (dst_info + index)->uid = uids[index];
}

media_relay_config_->dest_count = cids.size();
media_relay_config_->dest_infos = dst_info;

///====================== 以上是参数准备 ======================

/// 开始转发
int ret = nrtc_engine_->startChannelMediaRelay(media_relay_config_.get());
if (ret != nertc::kNERtcNoError) {
    /// error handling
}

/// 更新转发(相当于停止之前的全部转发,开始新的,所以需要在更新之前把前面做的参数准备工作再做一遍)
ret = nrtc_engine_->updateChannelMediaRelay(media_relay_config_.get());

/// 停止转发
ret = nrtc_engine_->stopChannelMediaRelay();
此文档是否对你有帮助?
有帮助
去反馈
  • 注意事项
  • 实现方法
  • API 时序
  • 实现步骤
  • 示例代码