在 CDN 直播观看 和 云端录制回放 等应用场景中,常需要将 TRTC 房间里的多路音视频流混合成一路,您可以使用腾讯云服务端的 MCU 的混流转码集群完成该项工作。MCU 集群能将多路音视频流进行按需混合,并将最终生成的视频流分发给直播 CDN 和云端录制系统。
云端混流有两种控制方式:
注意:方案二支持 iOS、Android、Windows、Mac、Electron、Flutter 和桌面浏览器平台的 SDK,如果您希望在微信小程序上也实现混流功能,请使用方案一。
云端混流包含解码、混合和再编码三个过程:
由您的服务器调用 REST API StartMCUMixTranscode 可以启动云端混流,对于此 API 您需关注如下细节:
通过 StartMCUMixTranscode
中的 LayoutParams 参数,可以设置如下几种排版模式:
悬浮模板(LayoutParams.Template = 0)
九宫格模板(LayoutParams.Template = 1)
屏幕分享模板(LayoutParams.Template = 2)
LayoutParams.MainVideoUserId
和 LayoutParams.MainVideoStreamType
这两个参数来指定左侧主画面的内容。画中画模板(LayoutParams.Template = 3)
LayoutParams
中的 MainVideoUserId
和 MainVideoStreamType
参数指定大画面这一路的用户 ID 和流类型。LayoutParams
中的 SmallVideoLayoutParams
参数指定小画面这一路的用户 ID、流类型和布局位置等信息。自定义模板(LayoutParams.Template = 4)
LayoutParams
中的 PresetLayoutConfig
参数(这是一个数组),预先设置各路画面的位置。PresetLayoutConfig
参数中的 UserId
参数,排版引擎会根据进房的先后顺序,将进房的用户依次分配到 PresetLayoutConfig
数组中指定的各个位置上。PresetLayoutConfig
数组中的某一个被指定了 UserId
参数,则排版引擎会预先给指定的用户预留好他/她在画面中的位置。PresetLayoutConfig
数组中预设的位置被用完后,排版引擎将不再混合其它用户的画面和声音。注意:云端混流服务最多支持同时混合16路音视频流,如果用户只有音频也会被算作一路。
通过 StartMCUMixTranscode
中的 EncodeParams 参数,可以设置混流编码参数:
名称 | 描述 | 推荐值 |
---|---|---|
AudioSampleRate | 混流-输出流音频采样率 | 48000 |
AudioBitrate | 混流-输出流音频码率,单位 kbps | 64 |
AudioChannels | 混流-输出流音频声道数 | 2 |
VideoWidth | 混流-输出流宽,音视频输出时必填 | 自定义 |
VideoHeight | 混流-输出流高,音视频输出时必填 | 自定义 |
VideoBitrate | 混流-输出流码率,单位 kbps,音视频输出时必填 | 自定义 |
VideoFramerate | 混流-输出流帧率,音视频输出时必填 | 15 |
VideoGop | 混流-输出流 GOP,音视频输出时必填 | 3 |
BackgroundColor | 混流-输出流背景色 | 自定义 |
OutputParams.PureAudioStream
参数为 1,代表仅把混音后的音频数据流转发到 CDN 上。OutputParams.RecordId_开始时间_结束时间
的格式命名,例如:file001_2020-02-16-12-12-12_2020-02-16-13-13-13
。OutputParams.RecordAudioOnly
参数为1,表示仅录制 MP3 格式的文件。由您的服务器调用 REST API StopMCUMixTranscode 即可结束混流。
使用 TRTC SDK 发起混流指令非常简单,只需调用各个平台的 setMixTranscodingConfig() API 即可,目前 SDK 提供了 4 种常用的混流方案:
参数项 | 纯音频模式(PureAudio) | 预排版模式(PresetLayout) | 屏幕分享模式(ScreenSharing) | 全手动模式(Manual) |
---|---|---|---|---|
调用次数 | 只需调用一次接口 | 只需调用一次接口 | 只需调用一次接口 | 以下场景需调用混流接口: |
混合内容 | 只混合音频 | 自定义设置各路内容 | 不混合学生端的画面 | 自定义设置各路内容 |
audioSampleRate | 推荐48000 | 推荐48000 | 推荐48000 | 推荐48000 |
audioBitrate | 推荐64 | 推荐64 | 推荐64 | 推荐64 |
audioChannels | 推荐2 | 推荐2 | 推荐2 | 推荐2 |
videoWidth | 无需设置 | 不能为0 | 推荐0 | 不能为0 |
videoHeight | 无需设置 | 不能为0 | 推荐0 | 不能为0 |
videoBitrate | 无需设置 | 不能为0 | 推荐0 | 不能为0 |
videoFramerate | 无需设置 | 推荐15 | 推荐15 | 推荐15 |
videoGOP | 无需设置 | 推荐3 | 推荐3 | 推荐3 |
mixUsers 数组 | 无需设置 | 使用占位符设置 | 无需设置 | 使用真实 userId 设置 |
纯音频模式适用于语音通话(AudioCall)和语音聊天室(VoiceChatRoom)等纯音频应用场景,该类场景下您可以在调用 SDK 的 enterRoom 接口时进行设定。
纯音频模式下,SDK 会自动将房间里的多路音频流混合成一路。
enterRoom()
函数进入房间时,根据您的业务需要,设定 AppScene 参数为 TRTCAppSceneAudioCall
或 TRTCAppSceneVoiceChatRoom
,明确当前房间中没有视频且只有音频。streamId
参数,指定 MCU 输出的混合音频流的去处。startLocalAudio()
开启本地音频采集和音频上行。
说明:由于云端混流的本质是将多路流混合到当前(即发起混流指令的)用户所对应的音视频流上,因此当前用户本身必须有音频上行才能构成混流的前提条件。
setMixTranscodingConfig()
接口启动云端混流,需要您在调用时将 TRTCTranscodingConfig
中的 mode
参数设定为 TRTCTranscodingConfigMode_Template_PureAudio,并指定 audioSampleRate
、audioBitrate
和 audioChannels
等关乎音频输出质量的参数。注意:纯音频模式下
setMixTranscodingConfig()
接口无需多次调用,在进房成功并开启本地音频上行后调用一次即可。
预排版模式适用于视频通话(VideoCall)和互动直播(LIVE)等音频和视频皆有的应用场景,该类场景下您可以在调用 SDK 的 enterRoom 接口时进行设定。
预排版模式下,SDK 会自动按照您预先设定各路画面的排版规则将房间里的多路音频流混合成一路。
enterRoom()
函数进入房间时,根据您的业务需要,设定 AppScene 参数为 TRTCAppSceneVideoCall
或 TRTCAppSceneLIVE
。streamId
参数,指定 MCU 输出的混合音频流的去处。startLocalPreview()
和 startLocalAudio()
开启本地的音视频上行。
说明:由于云端混流的本质是将多路流混合到当前(即发起混流指令的)用户所对应的音视频流上,因此当前用户本身必须有音视频上行才能构成混流的前提条件。
setMixTranscodingConfig()
接口启动云端混流,需要您在调用时将 TRTCTranscodingConfig
中的 mode
参数设定为 TRTCTranscodingConfigMode_Template_PresetLayout ,并指定 audioSampleRate
、audioBitrate
和 audioChannels
等关乎音频输出质量的参数,以及 videoWidth
、videoHeight
、videoBitrate
、videoFramerate
等关乎视频输出质量的参数。mixUser
参数,预排版模式下 mixUser
中的 userId
参数请使用 $PLACE_HOLDER_REMOTE$、$PLACE_HOLDER_LOCAL_MAIN$ 以及 $PLACE_HOLDER_LOCAL_SUB$ 这三个占位字符串,其含义如下表所示:占位符 | 含义 | 是否支持多个 |
---|---|---|
$PLACE_HOLDER_LOCAL_MAIN$ | 指代本地摄像头这一路 | 不支持 |
$PLACE_HOLDER_LOCAL_SUB$ | 指代本地屏幕分享这一路(只有画面) | 不支持 |
$PLACE_HOLDER_REMOTE$ | 指代远端连麦者,可以同时设置多个 | 支持 |
您可根据下面的示例代码实现“一大二小,上下叠加”的混合效果:
TRTCTranscodingConfig *config = [[TRTCTranscodingConfig alloc] init];
// 设置分辨率为720 × 1280, 码率为1500kbps,帧率为20FPS
config.videoWidth = 720;
config.videoHeight = 1280;
config.videoBitrate = 1500;
config.videoFramerate = 20;
config.videoGOP = 2;
config.audioSampleRate = 48000;
config.audioBitrate = 64;
config.audioChannels = 2;
// 采用预排版模式
config.mode = TRTCTranscodingConfigMode_Template_PresetLayout;
config.mixUsers = [NSMutableArray new];
// 主播摄像头的画面位置
TRTCMixUser* local = [TRTCMixUser new];
local.userId = @"$PLACE_HOLDER_LOCAL_MAIN$";
local.zOrder = 0; // zOrder 为0代表主播画面位于最底层
local.rect = CGRectMake(0, 0, videoWidth, videoHeight);
local.roomID = nil; // 本地用户不用填写 roomID,远程需要
[config.mixUsers addObject:local];
// 连麦者的画面位置
TRTCMixUser* remote1 = [TRTCMixUser new];
remote1.userId = @"$PLACE_HOLDER_REMOTE$";
remote1.zOrder = 1;
remote1.rect = CGRectMake(400, 800, 180, 240); //仅供参考
remote1.roomID = 97392; // 本地用户不用填写 roomID,远程需要
[config.mixUsers addObject:remote1];
// 连麦者的画面位置
TRTCMixUser* remote2 = [TRTCMixUser new];
remote2.userId = @"$PLACE_HOLDER_REMOTE$";
remote2.zOrder = 1;
remote2.rect = CGRectMake(400, 500, 180, 240); //仅供参考
remote2.roomID = 97392; // 本地用户不用填写 roomID,远程需要
[config.mixUsers addObject:remote2];
// 发起云端混流
[_trtc setMixTranscodingConfig:config];
注意:
- 预排版模式下
setMixTranscodingConfig()
接口无需多次调用,在进房成功并开启本地音频上行后调用一次即可。- Web 端接口命名与其他端稍有差异,详情请参见 Client.startMixTranscode()。
屏幕分享模式适用于在线教育和互动课堂等场景,该类场景下您可以在调用 SDK 的 enterRoom 接口时将 AppScene 参数设定为 TRTCAppSceneLIVE
。
屏幕分享模式下,SDK 会先根据您所选定的目标分辨率构建一张画布。当老师未开启屏幕分享时,SDK 会将摄像头画面等比例拉伸绘制到该画布上;当老师开启屏幕分享后,SDK 会将屏幕分享画面绘制到同样的画布上。通过构建画布可以确保混流模块的输出分辨率一致,防止录制和网页观看的视频兼容性问题(普通播放器不支持分辨率会变化的视频)。
enterRoom()
函数进入房间时,根据您的业务需要,设定 AppScene 参数为 TRTCAppSceneLIVE
。streamId
参数,指定 MCU 输出的混合音视频流的去处。startLocalPreview()
和 startLocalAudio()
开启本地的音视频上行。
说明:由于云端混流的本质是将多路流混合到当前(即发起混流指令的)用户所对应的音视频流上,因此当前用户本身必须有音视频上行才能构成混流的前提条件。
setMixTranscodingConfig()
接口启动云端混流,需要您在调用时将 TRTCTranscodingConfig
中的 mode
参数设定为 TRTCTranscodingConfigMode_Template_ScreenSharing ,并指定 audioSampleRate
、audioBitrate
和 audioChannels
等关乎音频输出质量的参数,以及 videoWidth
、videoHeight
、videoBitrate
、videoFramerate
等关乎视频输出质量的参数。
说明:若将
videoWidth
和videoHeight
参数均指定为0,SDK 会自动根据用户当前屏幕的宽高比计算出一个合适的分辨率。
注意:
- 屏幕分享模式仅支持 Windows 和 Mac 平台。
- 屏幕分享模式下
setMixTranscodingConfig()
接口无需多次调用,在进房成功并开启本地音频上行后调用一次即可。- 由于教学模式下的视频内容以屏幕分享为主,同时传输摄像头画面和屏幕分享画面非常浪费带宽。建议直接将摄像头画面和学生的画面通过
setLocalVideoRenderCallback()
和setRemoteVideoRenderCallback()
接口自绘到当前屏幕上。- 通过将 TRTCTranscodingConfig 中的
videoWidth
和videoHeight
参数均指定为 0,可以让 SDK 智能选择输出分辨率。如果老师当前屏幕宽度小于1920px,SDK 会使用老师当前屏幕的实际分辨率;如果老师当前屏幕宽度大于1920px,SDK 会根据当前屏幕宽高比,选择 1920 × 1080(16:9)、1920 × 1200(16:10)或1920 × 1440(4:3)。
全手动模式适合于上述自动模式均不适用的场景,全手动的灵活性最高,可以自由组合出各种混流方案,但易用性最差。
全手动模式下,您需要设置 TRTCTranscodingConfig
中的所有参数,并需要监听 TRTCCloudDelegate 中的 onUserVideoAvailable()
和 onUserAudioAvailable()
回调,以便根据当前房间中各个上麦用户的音视频状态不断地调整 mixUsers
参数,否则会导致混流失败。
enterRoom()
函数进入房间时,根据您的业务需要,设定 AppScene 参数。streamId
参数,指定 MCU 输出的混合音视频流的去处。startLocalAudio()
开启本地的音频上行(或同时调用 startLocalPreview()
开启视频上行)。
说明:由于云端混流的本质是将多路流混合到当前(即发起混流指令的)用户所对应的音视频流上,因此当前用户本身必须有音视频上行才能构成混流的前提条件。
setMixTranscodingConfig()
接口启动云端混流,需要您在调用时将 TRTCTranscodingConfig
中的 mode
参数设定为 TRTCTranscodingConfigMode_Manual ,并指定 audioSampleRate
、audioBitrate
和 audioChannels
等关乎音频输出质量的参数。如果您的业务场景中也包含视频,需同时设置 videoWidth
、videoHeight
、videoBitrate
、videoFramerate
等关乎视频输出质量的参数。onUserVideoAvailable()
和 onUserAudioAvailable()
回调,并根据需要指定 mixUsers 参数。
说明:与预排版(PresetLayout)模式不同,Manual 需要您指定每一个
mixUser
中的userId
参数为真实的连麦者 ID,并且也要根据该连麦者是否开启了视频,如实设定mixUser
中的pureAudio
参数。
注意:全手动模式下,您需要实时监听房间中连麦者的上麦下麦动作,并根据连麦者的人数和音视频状态,多次调用
setMixTranscodingConfig()
接口。
云端混流转码需要对输入 MCU 集群的音视频流进行解码后重新编码输出,将产生额外的服务成本,因此 TRTC 将向使用 MCU 集群进行云端混流转码的用户收取额外的增值费用。云端混流转码费用根据转码输出的分辨率大小和转码时长进行计费,转码输出的分辨率越高、转码输出的时间越长,费用越高。详情请参见 云端混流转码计费说明。
setMixTranscodingConfig
)的主播退出了房间。nil/null
主动停止混流。在其他情况下,TRTC 云端都将会尽力持续保持混流状态。因此,为避免产生预期之外的混流费用,请在您不需要混流的时候尽早通过上述方法结束云端混流。
哈喽各位同学们大家好呀 今天是开发者学院中课程“Spring Cloud微服务架构设计与...
TRTCMeeting 是基于腾讯云实时音视频(TRTC)和即时通信 IM 服务组合而成的,支...
操作场景 宝塔 Linux 面板(BT-Panel)是一款简单好用的服务器运维面板,支持一...
帮助用户完成SFS Turbo备份存储库的创建,快速购买SFS Turbo备份容器。 操作步骤...
通过创建实例快照,您可以为一台ECS实例中的多个云盘同时创建快照。实例快照能够...
每一年啊都需要捋一下,总结总结,砥砺奋进再出发。2020,这一年,更值得回头看...
IT服务管理(ITSM)已经存在了很长时间,而IT管理人员提出了一个关键问题:采用IT...
2012年,是世界服务器发展史上最重要的一年。这一年,云计算落地了,不少厂商从...
随着越来越多组织的员工在家远程工作,他们通过云计算服务可以轻松访问公司数据...
直播视频请点击 直播 观看。 本次分享将从五个方面讲解。 01 走进MaxCompute生态...