腾讯云实时音视频Web_音视频解决方案_同尘科技

实时音视频 2年前 (2023-12-19) 浏览 237

功能描述

在直播环境中,经常需要实现跨房连麦功能以支持不同直播间的主播进行实时互动。本文将主要介绍在 Web 端如何实现跨房间连麦以及混流后推送到 CDN 的方法。根据以下文档,您可以在两个或更多房间内实现主播的跨房连麦 PK 场景,并支持不同设备的主播进行跨房连麦。

前提条件

在实现跨房连麦之前,需要确认以下实时音视频的一些基础信息:userId:用户的唯一标识 ID。roomId:数字类型房间 ID。strRoomId:字符串类型房间 ID。trtc:由 TRTC.create 创建的客户端对象,拥有加入通话房间,发布本地音视频流,订阅远端流的功能。注意:混流双方的房间类型需要相同,不可以混用。在实现基础音视频通话时,我们根据 trtc 进入某个特定的 roomId 房间并发布本地流、订阅远端流以实现同一个房间中多个用户之间的音视频通话。在 Web 端, 让不同房间的 A,B 两个主播,分别使用自己的 userId 创建新的 trtc,进入到对方主播所在的房间订阅对方主播的流,即可实现跨房连麦。

使用步骤

步骤一:主播进入各自的房间并发布流

主播 A(创建 trtcA1)以主播身份在 1000 房间推流;主播 B(创建 trtcB1)以主播身份在 2000 房间推流。

// 主播 A 在 1000 房间推流const trtcA1 = TRTC.create({ plugins: [CDNStreaming] });await trtcA1.enterRoom({  sdkAppId: 0,  userId: 'A',  userSig: 'xxxx',  scene: TRTC.TYPE.SCENE_LIVE,  roomId: 1000,  role: TRTC.TYPE.ROLE_ANCHOR})trtcA1.startLocalVideo()trtcA1.startLocalAudio()
// 主播 B 在 2000 房间推流const trtcB1 = TRTC.create({ plugins: [CDNStreaming] });await trtcB1.enterRoom({  sdkAppId: 0,  userId: 'B',  userSig: 'xxxx',  scene: TRTC.TYPE.SCENE_LIVE,  roomId: 2000,  role: TRTC.TYPE.ROLE_ANCHOR})trtcB1.startLocalVideo()trtcB1.startLocalAudio()

此时,1000 房间和 2000 房间的用户状态如下:

              房间 1000                   房间 2000              -------------              ------------ 跨房连麦前:  | 主播 A      |             | 主播 B     |             | 观众 U V W  |             | 观众 X Y Z |              -------------              ------------

说明:对于观众通过标准直播拉流(CDN拉流)观看的情况,主播需要将自己的音视频流推送到 CDN。有关推送流到 CDN 的操作,请参考 实现推流到CDN。

步骤二:主播跨房连麦

主播 A(创建 trtcA2)以观众身份进入房间2000订阅主播 B 的流;主播 B(创建 trtcB2)以观众身份进入房间1000订阅主播 A 的流;此时主播 A 和 主播 B 跨房间连麦成功。

// 主播 A 以观众身份进入 2000 房间并订阅主播 B 的流const trtcA2 = TRTC.create()
trtcA2.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, (event) => { if (event.userId === 'B') { trtcA2.startRemoteVideo({ view: 'B_containerId', userId: event.userId, streamType: event.streamType }); }})
await trtcA2.enterRoom({ sdkAppId: 0, userId: 'A', userSig: 'xxxx', scene: TRTC.TYPE.SCENE_LIVE, roomId: 2000, role: TRTC.TYPE.ROLE_AUDIENCE})
// 主播 B 以观众身份进入 1000 房间并订阅主播 A 的流const trtcB2 = TRTC.create()
trtcB2.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, (event) => { if (event.userId === 'A') { trtcB2.startRemoteVideo({ view: 'A_containerId', userId: event.userId, streamType: event.streamType }); }})
await trtcB2.enterRoom({ sdkAppId: 0, userId: 'B', userSig: 'xxxx', scene: TRTC.TYPE.SCENE_LIVE, roomId: 1000, role: TRTC.TYPE.ROLE_AUDIENCE})
 //观众B 进去房间1000,观众A进入房间2000 拉流                 房间 1000                    房间 2000              --------------               -------------- 跨房连麦后:  | 主播 A        |             | 主播 B       |             | 观众 B U V W  |             | 观众 A X Y Z |              --------------               --------------

步骤三:跨房连麦后混流

对于标准直播拉流(CDN拉流)的场景来说,主播跨房间连麦之后需要将双方主播连麦的音视频混流后发布到 CDN。说明:Web TRTC SDK 自 v4.11.5 开始支持跨房间混流。详见 client.startMixTranscode。

1. 混流前提条件 – 开通旁路

1.1 TRTC SDK 版本需要 ≥ 5.1。1.2 开通腾讯 云直播 服务。应国家相关部门的要求,直播播放必须配置播放域名,具体操作请参考 域名管理。1.3 在 实时音视频控制台 左侧导航栏选择应用管理,单击目标应用所在行的配置,打开启用旁路推流的开关。“全局自动旁路”模式下,TRTC 所有上行音视频流都会被自动转推到腾讯云 CDN。“指定流旁路”模式下,您可以通过该插件或者 服务端 REST API 将指定音视频流推送到 CDN 且指定播放地址。

2. 发起混流

连麦中的主播需要在各自的推流房间中发起混流,将其他房间主播的流混到自己已经发布在 CDN 的音视频流上。

// 主播 A 发起跨房间混流,将房间 2000 中 B 主播的音视频流混到自己的旁路流// 注意:必须由发布本地流的 trtcA1 发起混流trtcA1.startPlugin('CDNStreaming', {  target: {    publishMode: CDNStreaming.TYPE.PublishMode.PublishMixStreamToCDN,  },  encoding: {    videoWidth: 1280,    videoHeight: 480,    videoBitrate: 1500,    videoFramerate: 15  },  mix: {    audioMixUserList: [      {        userId: 'A',        roomId: 1000      },      {        userId: 'B',        roomId: 2000      }    ],    videoLayoutList: [      {        fixedVideoUser: {          userId: 'A',          roomId: 1000        },        width: 640,        height: 480,        locationX: 0,        locationY: 0,        fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_MAIN,        zOrder: 1      },      {        fixedVideoUser: {          userId: 'B',          roomId: 2000,        },        width: 640,        height: 480,        locationX: 640,        locationY: 0,        fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_MAIN,        zOrder: 1      },    ]  }})
// 主播 B 发起跨房间混流,将房间 1000 中 A 主播的音视频流混到自己的旁路流// 注意:必须由发布本地流的 trtcB1 发起混流trtcB1.startPlugin('CDNStreaming', { target: { publishMode: CDNStreaming.TYPE.PublishMode.PublishMixStreamToCDN,, }, encoding: { videoWidth: 1280, videoHeight: 480, videoBitrate: 1500, videoFramerate: 15 }, mix: { audioMixUserList: [ { userId: 'A', roomId: 1000 }, { userId: 'B', roomId: 2000 } ], videoLayoutList: [ { fixedVideoUser: { userId: 'B', roomId: 1000 }, width: 640, height: 480, locationX: 0, locationY: 0, fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_MAIN, zOrder: 1 }, { fixedVideoUser: { userId: 'A', roomId: 2000, }, width: 640, height: 480, locationX: 640, locationY: 0, fixedVideoStreamType: TRTC.TYPE.STREAM_TYPE_MAIN, zOrder: 1 }, ] }})

3. CDN 拉流

情况一:当您推流到腾讯云 CDN 之后,TRTC 房间里的每一路画面都匹配一路对应的播放地址,播放地址拼接格式如下:

http://播放域名/live/[streamId].flv

获取 streamId:streamId 默认为${sdkAppId}_${roomId}_${userId}_main 。当您指定了 TRTC.createClient 中的 streamId 字段时,请使用 TRTC.createClient 接口指定的 streamId 拼接播放地址。当您指定了 client.startPublishCDNStream 的 streamId 字段时,请使用 client.startPublishCDNStream 接口指定的 streamId 拼接播放地址。情况二:当您推流到指定 CDN 地址之后,请使用您的推流地址对应的拉流地址。[播放域名] 为云直播中配置的播放域名,查看已有的域名请参考 域名管理。摄像头流的 [streamId] 默认值为 ${sdkAppId}_${roomId}_${userId}_main。屏幕分享流的 [streamId] 默认值为${sdkAppId}_${roomId}_${userId}_aux。当 roomId 或者 userId 包含特殊字符时(除了大小写英文字母(a-zA-Z)、数字(0-9)、连字符及下划线之外的均为特殊字符),默认 streamId 摄像头流为 ${sdkAppId}_${md5(${roomId}_${userId}_main)},屏幕分享流为 ${sdkAppId}_${md5(${roomId}_${userId}_aux)}情况二:当您推流到指定 CDN 地址之后,请使用您的推流地址对应的拉流地址观看混合之后的流;如需详细配置,可参考 云端混流与转推 CDN 教程 – 使用步骤。

对音视频的解决方案有疑惑?想了解解决方案收费? 联系解决方案专家

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心,购买腾讯云享受折上折,更有现金返利:同意关联,立享优惠

阿里云解决方案也看看?: 点击对比阿里云的解决方案

- 0人点赞 -

发表点评 (0条)

not found

暂无评论,你要说点什么吗?