云端混流转码
使用场景
云端混流主要用于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