乐趣区

关于sdk:多路混流实操流程

性能简介

混流是把多路音视频流从云端混合成单流的技术。

1混流长处

  • 升高了开发实现上的复杂性,例如当有 N 个主播进行连麦,如果采纳混流,观众端不用同时拉 N 路视频流,开发实现上省去了拉 N 路流并布局的步骤。
  • 升高了对设施的性能要求,缩小设施的性能开销和网络带宽的累赘。例如当连麦方过多时,观众端须要拉 N 路视频流,须要设施硬件上能反对同时拉 N 路流。
  • 转推多路 CDN 实现简略,只须要在混流配置时按需减少输入流。
  • 观众端须要回放多主播连麦视频时,仅须要在 CDN 上开启录制的配置。
  • 鉴黄时只须要察看一个画面,不用再同时查看多个画面。

2混流常见应用场景

  • 当设施不反对同时拉 N 路流时应用混流。
  • 须要多个视频画面合成一个视频时应用混流,比方教育类场景,直播老师和学生的画面。

3混流应用阐明

SDK 既反对音视频混流,也反对纯音频混流。

开发者在拉流 / 推流胜利后开始混流。比方主播 A 与观众 B 胜利连麦后,胜利拉取到观众 B 的画面时即开始混主播 A 的流和观众 B 的流。也能够依据需要,在其余适合机会进行混流。

4混流零碎架构

应用混流性能时,SDK 将流推到 ZEGO 服务器上,ZEGO 服务器将指定流混合成一路流后再推到 CDN 上,观众从 CDN 上拉混流观看。

前提条件

在混流前,请确保已在我的项目中实现根本的实时音视频性能,详情请参考 疾速开始 相干文档。

混流性能不是默认开启的,应用前请在 ZEGO 控制台 自助开明(开明步骤请参考 项目管理 – 服务配置 中的“混流”),或分割 ZEGO 技术支持开明。

应用步骤

混流前房间内须要有已存在的流。发动混流的设施能够混房间内已有的其余设施推的流而本端不必推流,也能够本端推流后再混本人推的流。

1设置混流配置

ZegoMixerTask 是 SDK 中定义的混流工作配置对象,其中蕴含输出流布局、输入流等信息。

混流配置类原型:

​
export class ZegoMixerTask {
    // 混流工作 ID
    taskID: string
    // 混流工作对象的输出流列表(必填)inputList: ZegoMixerInput[]
    // 混流工作对象的输入列表(必填)outputList: ZegoMixerOutput[]
    // 混流工作对象的视频配置(可选,若对视频画面布局有要求,则必须显式填写输入的分辨率)videoConfig: ZegoMixerVideoConfig
    // 混流工作对象的音频配置(可选)audioConfig: ZegoMixerAudioConfig
    // 是否开启混流中携带各输出流的声浪信息
    enableSoundLevel: boolean
​
    // 通过 TaskID 结构一个混流工作对象
    constructor(taskID: string) {
        this.taskID = taskID
        this.inputList = []
        this.outputList = []
        this.audioConfig = {bitrate: 48, channel: ZegoAudioChannel.Mono, codecID: ZegoAudioCodecID.Normal}
        this.videoConfig = {width: 360, height: 640, fps: 15, bitrate: 600}
        this.enableSoundLevel = false
    }
}
1.1 创立混流工作对象

新建一个混流工作对象,再别离设置输出、输入等参数。

const task = new ZegoMixerTask("MY_TASK_ID");
1.2(可选)设置混流视频配置

阐明:本节操作仅实用于音视频场景,纯音频场景下无需设置。

默认配置为 360 p, 15 fps, 600 kbps。

task.videoConfig = {width: 360, height: 640, fps: 15, bitrate: 600}
1.3(可选)设置混流音频配置

默认为 48 kbps。

task.audioConfig = {bitrate: 48, channel: ZegoAudioChannel.Mono, codecID: ZegoAudioCodecID.Normal}
1.4 设置混流输出流

默认反对最多输出 9 路流,如果须要输出更多路流,请分割 ZEGO 技术支持确认和配置。

留神:当混入的流为音频流时(即“ContentType”参数设置为音频混流类型),SDK 外部不解决布局字段,此时无需关注“layout”参数。

如下代码以混两路流,高低布局为例:

ask.inputList.push({"streamID": "stream-1", "contentType": ZegoMixerInputContentType.Video, "layout": {"x": 0, "y": 0, "width": task.videoConfig.width, "height": task.videoConfig.height/2}})
​
task.inputList.push({"streamID": "stream-2", "contentType": ZegoMixerInputContentType.Video, "layout": {"x": 0, "y": task.videoConfig.height / 2, "width": task.videoConfig.width, "height": task.videoConfig.height/2}})
1.5 设置混流输入

混流输入最多可设置 3 个。当输入指标为 URL 格局时,目前只反对 RTMP URL 格局:rtmp://xxxxxxxx,且不能传入两个雷同的混流输入的地址。

如下代码以输入到 ZEGO 服务器,流名为 “output-stream” 为例:

task.outputList = [{"target": "output-stream"}]

2开始混流工作

实现了 ZegoMixerTask 混流工作对象的配置后,调用 startMixerTask 接口以启动该混流工作,并在异步后果返回中解决启动混流工作失败的逻辑。

  • 接口原型:
// 开始混流工作
// @param task 已配置好混流参数的工作
startMixerTask(task: ZegoMixerTask): Promise<ZegoMixerStartResult>;
  • 调用示例:
​
ZegoExpressEngine.instance().startMixerTask(task).then((result) => {if (result.errorCode == 0) {console.log("Start mixer task success");
    } else {console.log("Start mixer task fail");
    }
}];

3更新混流工作的配置

当混流信息产生变更时(例如混流的输出流列表产生增减、调整混流视频输入码率等,批改该混流工作对象的参数),再调用一次 startMixerTask 接口即可更新配置。

留神:更新混流工作的配置时,“taskID”不可更改。

如下代码以进行混流工作途中增加一条输出流,上中下布局为例:

// 先将原来的输出流数组清空
task.inputList = []
// 从新设置之前保留的混流对象的输出流列表
task.inputList.push({"streamID": "stream-1", "contentType": ZegoMixerInputContentType.Video, "layout": {"x": 0, "y": 0, "width": task.videoConfig.width, "height": task.videoConfig.height/3}})
​
task.inputList.push({"streamID": "stream-2", "contentType": ZegoMixerInputContentType.Video, "layout": {"x": 0, "y": task.videoConfig.height / 3, "width": task.videoConfig.width, "height": task.videoConfig.height/3}})
​
task.inputList.push({"streamID": "stream-3", "contentType": ZegoMixerInputContentType.Video, "layout": {"x": 0, "y": task.videoConfig.height * (2/3), "width": task.videoConfig.width, "height": task.videoConfig.height/3}})
// 再调用一次启动混流工作接口,即可更新混流配置
ZegoExpressEngine.instance().startMixerTask(task).then((result) => {if (result.errorCode == 0) {console.log("Start mixer task success");
    } else {console.log("Start mixer task fail");
    }
}];

4进行混流

调用 stopMixerTask 接口进行混流。

  • 接口原型:
/// 进行混流工作
/// @param task 已保留的混流工作
stopMixerTask(task: ZegoMixerTask): Promise<ZegoMixerStopResult>;
  • 调用示例:
// 传入正在混流中的 task 以进行该混流工作 ZegoExpressEngine.instance().stopMixerTask(task);
​

API 参考列表

办法 形容
startMixerTask 开始混流工作
stopMixerTask 进行混流工作
setAudioConfig 设置混流工作对象的音频配置
setVideoConfig 设置混流工作对象的视频配置

常见问题

1. 能将混流推到第三方 CDN 吗?如何转推多路 CDN?

若须要将混流推到第三方 CDN,可在 ZegoMixerOutput 的“target”参数填写 CDN 的 URL。填写的 URL 格局须要为 RTMP 格局,例如“rtmp://xxxxxxxx”。

推多路 CDN 就创立 N 个输入流对象 ZegoMixerOutput 放入“ZegoMixerTask”中的“outputList”输入列表中。

2. 如何设置混流中每条流的布局?

ZegoMixerInput 的“layout”参数应用示例:

  • 假如指定某条流的左上角坐标为 (50,300),右下角坐标为 (200,450),即“layout”参数为 {“x”: 50, “y”: 300, “width”: 200 – 50, “height”: 450 – 300}。

<!—->

  • 假如 ZegoMixerTask 的“videoConfig”参数中的分辨率“width”和“height”别离为 (375, 667)。

则这条流在最终的输入混流中的地位如下所示:

3. 混流输出对象 ZegoMixerInput 的“ZegoRect”布局的比例与这条流自身的分辨率不相符时,画面将如何裁剪?

SDK 会做等比缩放。假如一条输出流的分辨率为“720×1280”,即比例为“9:16”,同时这条流的“ZegoMixerInput”的“layout”参数为 {“x”: 0, “y”: 0, “width”: 100, “height”: 100} 即比例为“1:1”时,画面将会显示这条流的两头局部,即高低局部被裁剪掉。

4. 参加连麦的主播们想让各自的观众看到本人的视频在混流后的画面布局中位于大窗口,如何混流?

主播们各自布局再各自发动混流。

例如:主播 A 设置本人推的流 A 画面布局的宽高大于拉主播 B 的流 B 的布局宽高,而后发动一个混流工作输入一个流“A_Mix”。主播 B 设置本人推的流 B 画面布局的宽高大于拉主播 A 的流 A 的布局宽高,而后发动混流输入一个 流“B_Mix”。

即总共须要发动两个混流工作。

5.“单主播开始直播后马上开始混流”与“当第二主播退出连麦时才开始混流”两种混流形式有什么区别?优劣势是什么?

从单主播直播开始就启动混流的长处是实现简略,毛病是会多一些额定的混单流工夫的 CDN 老本开销。

从单主播直播开始仅推流,等第二路主播退出连麦时才启动混流,长处是节约老本,毛病是开发实现上会简单一些。观众端须要先拉取单主播流,主播们连麦开启混流后须要进行拉单主播流,而后改为拉取混流。而从单主播开始混流的形式,观众端不须要做从拉单主播流再到拉混流的一个切换。

6. 混流是否反对圆形或者方形的画面?

不反对圆形,方形可通过布局实现。

退出移动版