功能简介
混流是把多路音视频流从云端混合成单流的技术。
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” 参数。
如下代码以混两路流,上下布局为例:
task.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 | 设置混流任务对象的视频配置 |
原创文章,作者:ZEGO即构科技,如若转载,请注明出处:https://market-blogs.zego.im/reports-technique/527/