前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实时音视频开发学习8 - 云端混流转码

实时音视频开发学习8 - 云端混流转码

原创
作者头像
金林学音视频
发布2020-08-25 18:03:20
1.9K0
发布2020-08-25 18:03:20
举报
文章被收录于专栏:实时音视频TRTC从小白到熟练

云端混流转码

使用场景

云端混流主要用于CND直播观看和云端录制回放等场景中,需要将TRTC房间里的多路音视频流混合成一路。混流方式为MCU混流转码集群,其能将多路音视频流进行混合,并将最终生成的视频流分发给直播CDN和云端录制系统。

MCU集群

MCU(Multipoint Conferencing Unit)方案,该方案由一个服务器和多个终端组成一个星形结构。各终端将自己要共享的音视频流发送给服务器,服务器端会将在同一个房间中的所有终端的音视频流进行混合,最终生成一个混合后的音视频流再发给各个终端,这样各终端就可以看到或听到其他终端的音视频了。实际上服务器端就是一个音视频混合器,这种方案服务器的压力会非常大。

“1对1”通信:

在 1对 1 通信中,WebRTC 首先尝试两个终端之间是否可以通过 P2P 直接进行通信,如果无法直接通信的话,则会通过 STUN/TURN 服务器进行中转。实际上,1 对 1 通信模型设计的主要目标是尽量让两个终端进行直联,这样即可以节省服务器的资源,又可以提高音视频的服务质量

MCU 主要的处理逻辑是:接收每个共享端的音视频流,经过解码、与其他解码后的音视频进行混流、重新编码,之后再将混合好的音视频流发送给房间里的所有人。

MCU 技术在视频会议领域出现得非常早,目前技术也非常成熟,主要用在硬件视频会议领域。MCU 方案的模型是一个星形结构,如下图所示:

MCU方案:

假设B1 与 B2 同时共享音视频流,它们首先将流推送给 MCU 服务器,MCU 服务器收到两路流后,分别将两路流进行解码,之后将解码后的两路流进行混流,然后再编码,编码后的流数据再分发给 B3 和 B4。

对于 B1 来说,因为它是其中的一个共享者,所以 MCU 给它推的是没有混合它的共享流的媒体流,而是直接推 B2 的流给它。同理,对于 B2 来说 MCU 给它发的是 B1 的共享流。但如果有更多的人共享音视频流,那情况就更加复杂。

MCU主逻辑:

MCU优点:

1.技术非常成熟,在硬件视频会议中应用非常广泛。

2.作为音视频网关,通过解码、再编码可以屏蔽不同编解码设备的差异化,满足更多客户的集成需求,提升用户体验和产品竞争力。

3.将多路视频混合成一路,所有参与人看到的是相同的画面,客户体验非常好。

缺点:

1.重新解码、编码、混流,需要大量的运算,对 CPU 资源的消耗很大。

2.重新解码、编码、混流还会带来延迟。

3.由于机器资源耗费很大,所以 MCU 所提供的容量有限,一般十几路视频就是上限了。

参考:https://www.cnblogs.com/yiyi17/p/12076657.html

云端混流解析

云端混流包含解码、混合和再编码三个过程。解码,MCU需要将多路音视频流进行解码,包括视频解码和音频解码;混合,MCU需要将多路画面混合在一起,并根据来自SDK的混流指令实现具体的排版方案,同时MCU也需要将解码后的多路音视频信号进行混音处理;编码,MCU需要将混合后的画面和声音进行二次编码,并封装成一路音视频流,交给下游系统,如直播和录制。

混流的两种控制方案

方案一:

使用服务端REST API StartMCUMixTranscode 和 StopMCUMixTranscode 进行控制,该 REST API 还可以同时支持启动 CDN 观看和云端录制。

启动混流:

由服务器调用 REST API StartMCUMixTranscode 可以启动云端混流,对此有以下几种需要注意的事项。

设置画面排版模式:通过 StartMCUMixTranscode 中的 LayoutParams 参数,可以将画面设置成悬浮模板、九宫格模板、画中画模板以及屏幕分享模板。

悬浮模板:

a.第一个进入房间的用户的视频画面会铺满整个屏幕,其他用户的视频画面从左下角依次水平排列,显示为小画面。

b.最多4行,每行最多4个,小画面悬浮于大画面之上。

c.最多支持1个大画面和15个小画面。

d.如果用户只发送音频,仍然会占用画面位置。

九宫格模板:

a.所有用户的视频画面大小一致,平分整个屏幕,人数越多,每个画面的尺寸越小。

b.最多支持16个画面,如果用户只发送音频,仍然会占用画面位置。

屏幕分享模板:

a.适合视频会议和在线教育场景的布局。

b.屏幕分享(或者主讲的摄像头)始终占据屏幕左侧的大画面位置,其他用户依次垂直排列于右侧。

c.需要通过 LayoutParams的MainVideoUserId 和MainVideoStreamType 这两个参数来指定左侧主画面的内容。

d.最多两列,每列最多8个小画面。最多支持1个大画面和15个小画面。

e.如果用户只发送音频,仍然会占用画面位置。

画中画模板则为一种小面板显示,通过StartMCUMixTranscode接口进行设置,使用较少。其参数设置方式如下:

设置混流编码参数:

通过 StartMCUMixTranscode 中的 EncodeParams 参数,可以设置混流编码参数。

官方推荐参数自定义如下:

设置开启云端录制或CDN直播:

RecordId参数用于指定是否启动 云端录制,如果您指定此参数,那么混流后的音视频流会被录制成文件并存储到 云点播 中。录制下来的文件会按照 OutputParams.RecordId_开始时间_结束时间 的格式命名,例如file001_2020-02-16-12-12-12_2020-02-16-13-13-13。

RecordAudioOnly用于指定录制文件格式为mp3。

StreamId用于指定是否启动 CDN 直播观看,如果您指定此参数,那么混流后的音视频流会被导入到 云直播系统 中。不过只有在您已经开通了直播服务,并配置了播放域名的情况下,才能通过 CDN 正常观看这条直播流。

PureAudioStream设置 OutputParams.PureAudioStream 参数为 1,代表仅把混音后的音频数据流转发到 CDN 上。

退出混流

首先调用模块中的StopMCUMixTranscodeRequest停止请求混流的代码片段,然后设置退出房间对应的sdkAppID和roomID的参数params,接着使用该请求体的from_json_string将参数json化,最后调用StopMCUMixTranscode停止混流代码的传送。

代码生成

通过访问StopMCUMixTranscode平台,可以快速配置MCU混流输出流编码参数、混流布局以及MCU混流输出流编码参数等。但是再使用该生成器的时候,需要再您的腾讯云访问管理器中的访问密钥的API密钥管理,新建一个密钥,然后用生成的SecretId、SecretKe来设置个人密钥。

通过在线调试可以得到相应的结果、响应头以及真实请求。参考网址如下:

https://console.cloud.tencent.com/api/explorer?Product=trtc&Version=2019-07-22&Action=StartMCUMixTranscode&SignVersion=

详细代码见demo07。

方案二:

使用客户端 TRTC SDK 的 setMixTranscodingConfig 接口进行控制,其控制流程如下图:

使用方案二仅支持IOS、Android、Windows、Mac和Electron五个平台的SDK,因此这里仅对SDK提供的四种混流方案做一个介绍

纯音频模式:

纯音频模式PureAudio适用有语音通话AudiCall和语音聊天室VoiceChatRoom等纯音频的应用场景。纯音频模式下setMixTranscodingConfig接口无需多次调用,只需要在进房成功并开启本地音视频上行调用一次即可。

一般情况下,audioSampleRate取值48000,audioBitrate取值64,声道audioChannels取值2。

使用流程

1.在调用 enterRoom() 函数进入房间时,根据您的业务需要,设定 AppScene 参数为 TRTCAppSceneAudioCall 或 TRTCAppSceneVoiceChatRoom,明确当前房间中没有视频且只有音频。

2.开启 旁路直播,并设定 TRTCParams 中的 streamId 参数,指定 MCU 输出的混合音频流的去处。

3.调用 startLocalAudio() 开启本地音频采集和音频上行。由于云端混流的本质是将多路流混合到当前(即发起混流指令的)用户所对应的音视频流上,因此当前用户本身必须有音频上行才能构成混流的前提条件。

4.调用 setMixTranscodingConfig() 接口启动云端混流,需要您在调用时将 TRTCTranscodingConfig 中的 mode 参数设定为 TRTCTranscodingConfigMode_Template_PureAudio,并指定 audioSampleRate、audioBitrate 和 audioChannels 等关乎音频输出质量的参数。

经过上述步骤,当前用户的旁路音频流中就会自动混合房间中其他用户的声音,然后就能进行CDN直播或者云端录制。

预排版模式

预排版模式主要用于视频通话VideoCall和互动直播LIVE等音视频应用。一般情况下,audioSampleRate取值48000,audioBitrate取值64,声道audioChannels取值2。videoFramerate取值15,videoGOP取值3,且视频的宽高均不为0。同纯音频模式一样setMixTranscodingConfig仅需调用一次即可。

使用流程

1.在调用 enterRoom() 函数进入房间时,根据您的业务需要,设定 AppScene 参数为 TRTCAppSceneVideoCall 或 TRTCAppSceneLIVE。

2.开启 旁路直播,并设定 TRTCParams 中的 streamId 参数,指定 MCU 输出的混合音频流的去处。

3.调用 startLocalPreview() 和 startLocalAudio() 开启本地的音视频上行。由于云端混流的本质是将多路流混合到当前(即发起混流指令的)用户所对应的音视频流上,因此当前用户本身必须有音视频上行才能构成混流的前提条件。

4.调用 setMixTranscodingConfig() 接口启动云端混流,需要您在调用时将 TRTCTranscodingConfig 中的 mode 参数设定为 TRTCTranscodingConfigMode_Template_PresetLayout ,并指定 audioSampleRate、audioBitrate 和 audioChannels 等关乎音频输出质量的参数,以及 videoWidth、videoHeight、videoBitrate、videoFramerate 等关乎视频输出质量的参数。

5.组装 mixUser 参数,预排版模式下 mixUser 中的 userId 参数请使用 $PLACE_HOLDER_REMOTE$、$PLACE_HOLDER_LOCAL_MAIN$ 以及 $PLACE_HOLDER_LOCAL_SUB$ 这三个占位字符串,其含义如下表所示:

完成上述流程后,当前用户的旁路音频流中就会自动混合房间中其他用户的声音,就能进行CDN直播或云端录制。

当进入房间后会给画面预留出一个主位置和若干远程画面位置,每个用户所在的房间自己占据主位置,其余被分享观众则依次排在画面的预留位置处。

屏幕分享模式

屏幕分享模式适用于在线教育和互动课堂等场景,该类场景下您可以在调用 SDK 的 enterRoom 接口时将 AppScene 参数设定为 TRTCAppSceneLIVE。

屏幕分享模式下,SDK 会先根据您所选定的目标分辨率构建一张画布。当老师未开启屏幕分享时,SDK 会将摄像头画面等比例拉伸绘制到该画布上;当老师开启屏幕分享后,SDK 会将屏幕分享画面绘制到同样的画布上。通过构建画布可以确保混流模块的输出分辨率一致,防止录制和网页观看的视频兼容性问题(普通播放器不支持分辨率会变化的视频)

使用步骤

1.在调用 enterRoom() 函数进入房间时,根据您的业务需要,设定 AppScene 参数为 TRTCAppSceneLIVE。

2.开启 旁路直播,并设定 TRTCParams 中的 streamId 参数,指定 MCU 输出的混合音视频流的去处。

3.调用 startLocalPreview() 和 startLocalAudio() 开启本地的音视频上行。由于云端混流的本质是将多路流混合到当前(即发起混流指令的)用户所对应的音视频流上,因此当前用户本身必须有音视频上行才能构成混流的前提条件。

4.调用 setMixTranscodingConfig() 接口启动云端混流,需要您在调用时将 TRTCTranscodingConfig 中的 mode 参数设定为 TRTCTranscodingConfigMode_Template_ScreenSharing ,并指定 audioSampleRate、audioBitrate 和 audioChannels 等关乎音频输出质量的参数,以及 videoWidth、videoHeight、videoBitrate、videoFramerate 等关乎视频输出质量的参数

完成之后,当前用户的旁路音频流中就会自动混合房间中其他用户的声音,就能进行CDN直播或云端录制。

需要注意的是,屏幕分享模式仅支持 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 参数,否则会导致混流失败。

全手动模式下,连麦者进入/退出、摄像头打开/关闭都会调用setMixTranscodingConfig接口,并且mixUsers数组需要设置真实的连麦者userId,并且也要根据该连麦者是否开启了视频,如实设定 mixUser 中的 pureAudio 参数。

使用步骤

1.在调用 enterRoom() 函数进入房间时,根据您的业务需要,设定 AppScene 参数。

2.开启 旁路直播,并设定 TRTCParams 中的 streamId 参数,指定 MCU 输出的混合音视频流的去处。

3.根据您的业务需要,调用 startLocalAudio() 开启本地的音频上行(或同时调用 startLocalPreview() 开启视频上行)。由于云端混流的本质是将多路流混合到当前(即发起混流指令的)用户所对应的音视频流上,因此当前用户本身必须有音视频上行才能构成混流的前提条件。

4.调用 setMixTranscodingConfig() 接口启动云端混流,需要您在调用时将 TRTCTranscodingConfig 中的 mode 参数设定为 TRTCTranscodingConfigMode_Manual ,并指定 audioSampleRate、audioBitrate 和 audioChannels 等关乎音频输出质量的参数。如果您的业务场景中也包含视频,需同时设置 videoWidth、videoHeight、videoBitrate、videoFramerate 等关乎视频输出质量的参数。

5.监听 TRTCCloudDelegate 中的 onUserVideoAvailable() 和 onUserAudioAvailable() 回调,并根据需要指定 mixUsers 参数。

完成上述步骤后,只要当前用户的旁路音频流中就会自动混合房间中其他用户的声音,便能进行CDN直播或云端录制。

*更多直播内容请观看:https://cloud.tencent.com/document/product/267/20385

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 云端混流转码
    • 使用场景
      • MCU集群
        • “1对1”通信:
        • MCU方案:
        • MCU优点:
        • 缺点:
      • 云端混流解析
        • 混流的两种控制方案
          • 方案一:
        • 方案二:
          • 纯音频模式:
      相关产品与服务
      云直播
      云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档