摘要:多人实时会议中,重要发言人的声音常被其他参会者淹没。本文介绍了ZEGO 实时音视频 SDK (ZEGO Express SDK) 的混流焦点语音(Focus Voice)方案,通过服务端混流的 mixMode = focused 与 isAudioFocus 参数,在混流输出中突出特定发言人的声音,所有拉流端统一生效。文章从问题背景、方案选型、核心原理、关键 API 参数、iOS/Android/服务端代码示例,到动态切换焦点和成本优化,覆盖了完整的实现链路。适合需要”主持人模式”或”汇报人模式”的视频会议、线上答辩等场景的开发者。

一、背景
做过多人在线会议或语聊房的开发者,大概率遇到过这些场景:
- “主持人说话,背景里七嘴八舌,底下人听不清。”
- “老师讲课,学生那边环境嘈杂,课堂体验很差。”
- “线上答辩,当前汇报人的声音被其他参会者盖住了。”
这些场景的共同痛点是:房间内多人同时说话时,重要发言人的声音被淹没。解决这个问题的传统方式无非两种:让其他人手动闭麦(依赖自觉,体验割裂),或者在客户端调高某个人的音量(各端各自为政,无法统一控制)。前者依赖用户行为,后者只影响本地,都不算优雅的工程方案。
ZEGO Express SDK 早在 2021 年的 v2.6.0 版本起就提供了一个专门解决这个问题的能力:焦点语音(Focus Voice)。它不是客户端层面的音量调节,而是在服务端混流阶段对音频流做优先级处理,让所有拉流端统一听到以焦点发言人为主的声音。
二、方案选型:两条路径
在 ZEGO 体系内,突出某个发言人声音可以走两条路:
路径 A:客户端独立调节
每个观众端调用远端音频流的音量调节 API,自行降低其他人的音量或提高目标人的音量。
- 优点:实现简单,不需要服务端参与。
- 缺点:各端独立控制,无法统一;主持人切换焦点时需要各端分别响应信令;本质上是”谁听谁自己调”,不是”发言人的声音被突出”。
适合”我觉得谁太吵、我调低谁”的个人偏好场景。
路径 B:服务端混流焦点语音
所有流在服务端混成一路输出,混流引擎对标记为焦点(isAudioFocus = true)的流做优先级处理,输出流中焦点发言人的声音在音量或清晰度上明显突出。
- 优点:所有拉流端统一生效;焦点切换只需服务端更新混流参数;适合”主讲人模式””会议主持人模式”。
- 缺点:依赖混流服务,需要额外开通和付费;混流会引入少量延迟。
本文聚焦路径 B,即服务端混流焦点语音方案。
三、核心原理:混流焦点语音
什么是混流
混流(Stream Mixing)是指将房间内多路音视频流在 ZEGO 服务端合并为一路流输出。客户端可以拉到这路混流,也可以推到 CDN 供更大量观众播放。
焦点语音的工作原理
常规混流模式下(mixMode 为默认值),所有输入流的音频按相同权重叠加。如果三人同时说话,输出里就是三人的声音混在一起——谁嗓门大谁突出,没有优先级概念。
焦点语音模式下(mixMode = focused),混流引擎会识别被标记为焦点的流(isAudioFocus = true),对其音频信号做增强处理。其他未标记的流保持正常或适当压低,从而实现”焦点发言人声音突出”的效果。
架构示意
房间 1001 内:
用户 A 推流 (stream_a) ──┐
用户 B 推流 (stream_b) ──┤ isAudioFocus = true ← 焦点发言人
用户 C 推流 (stream_c) ──┘
↓
ZEGO 混流引擎
mixMode = focused
↓
输出混流 (mix_output)
B 的声音被突出,A/C 正常或压低
↓
所有拉流端听到一致的输出
关键点:焦点语音影响的是混流输出流,原始各用户的独立流不受影响。如果你同时拉混流和各用户的独立流,独立流的声音不会有变化。
四、关键 API 与参数
焦点语音涉及客户端 SDK 的混流 API 和服务端 REST API,核心参数结构一致。
4.1 ZegoMixerAudioConfig — 混流音频配置
| 参数 | 类型 | 说明 |
|---|---|---|
mixMode | 枚举 | 混流音频模式。设为 focused 启用焦点语音;默认值为常规模式 |
4.2 ZegoMixerInput — 单路输入流配置
每路参与混流的流都需要一个 ZegoMixerInput,关键字段:
| 参数 | 类型 | 说明 |
|---|---|---|
streamID | String | 输入流的 ID |
contentType | 枚举 | 流类型:音频流 / 视频流 / 音视频流 |
isAudioFocus | Boolean | 是否将该流标记为焦点语音流。 仅在 mixMode = focused 时生效 |
layout | Object | 该流在混流画面中的布局(纯音频混流可忽略) |
4.3 服务端 REST API StartMix 等价参数
服务端 REST API 对应参数名和客户端 SDK 基本一致,差异仅在 JSON 字段命名风格(camelCase vs PascalCase),逻辑完全相同。
调用服务端混流 API 需要签名鉴权,具体可参考 ZEGO 服务端 API 签名文档。
五、实现步骤
以下以 iOS Objective-C 为例,其余平台 API 结构一致。
5.1 前提准备
- 在 ZEGO 控制台 创建项目,获取 AppID 和 ServerSecret
- 在控制台开通混流服务
- 完成 SDK 初始化和登录房间(略,参考官方快速开始)
5.2 构造混流音频配置(启用焦点模式)
ZegoMixerAudioConfig *audioConfig = [[ZegoMixerAudioConfig alloc] init];
audioConfig.mixMode = ZegoMixModeFocused; // 焦点语音模式
5.3 构造输入流列表(标记焦点流)
// 参会者 A 的流 — 普通流
ZegoMixerInput *inputA = [[ZegoMixerInput alloc] init];
inputA.streamID = @"stream_a";
inputA.contentType = ZegoMixerInputContentTypeAudio;
// 参会者 B 的流 — 焦点流(主讲人)
ZegoMixerInput *inputB = [[ZegoMixerInput alloc] init];
inputB.streamID = @"stream_b";
inputB.contentType = ZegoMixerInputContentTypeAudio;
inputB.isAudioFocus = YES; // 标记为焦点
// 参会者 C 的流 — 普通流
ZegoMixerInput *inputC = [[ZegoMixerInput alloc] init];
inputC.streamID = @"stream_c";
inputC.contentType = ZegoMixerInputContentTypeAudio;
NSArray<ZegoMixerInput *> *inputList = @[inputA, inputB, inputC];
5.4 构造混流任务并发起
ZegoMixerTask *task = [[ZegoMixerTask alloc] init];
task.taskID = @"mix_task_1001";
task.audioConfig = audioConfig;
task.inputList = inputList;
task.outputList = @[output]; // 混流输出目标
[[ZegoExpressEngine sharedInstance] startMixerTask:task callback:^(int errorCode, NSDictionary *extendedData) {
if (errorCode == 0) {
NSLog(@"混流任务开启成功,焦点发言人:B");
} else {
NSLog(@"混流失败,错误码:%d", errorCode);
}
}];
5.5 动态切换焦点发言人
需要更换焦点发言人时(比如从 B 切换到 C),重新调用 startMixerTask:
// 将 inputB 的 isAudioFocus 改为 NO
inputB.isAudioFocus = NO;
// 将 inputC 的 isAudioFocus 改为 YES
inputC.isAudioFocus = YES;
// 重新发起,混流引擎会更新焦点
[[ZegoExpressEngine sharedInstance] startMixerTask:task callback:^(int errorCode, NSDictionary *extendedData) {
// ...
}];
混流过程中可以动态更新
isAudioFocus,无需先停止混流再重新发起。
七、适用场景
| 场景 | 焦点发言人 | 说明 |
|---|---|---|
| 视频会议 | 主持人 / 当前汇报人 | 保障会议秩序,重要发言不被打断 |
| 在线课堂 | 老师 | 老师声音始终清晰,学生讨论时切换焦点到学生 |
| 语聊房 | 当前麦位上的用户 | 上麦者自动设为焦点,其他人为背景 |
| K 歌房 | 当前演唱者 | 演唱者的声音被突出,伴奏+他人作为背景 |
| 线上答辩 / 汇报 | 当前答辩者 / 汇报人 | 观众和评委能清晰听到汇报内容 |
| 远程医疗会诊 | 当前讲解病情的医生 | 确保关键诊断信息不遗漏 |
八、注意事项与常见问题
8.1 混流成本
混流是付费服务,每路混流输出按分钟计费。纯音频混流和音视频混流价格不同。开启焦点语音不会产生额外费用(是混流功能的一部分),但混流本身需要付费。建议评估并发混流任务数量再上线。
8.2 动态更新
混流过程中可以动态更新 isAudioFocus 和 mixMode,只需重新调用 startMixerTask 接口传入新参数即可,无需先停止混流再重启。但部分参数(如音频编码格式 AudioCodec)不支持动态更新,需要在首次创建时确定。
8.3 仅音频混流的特殊处理
如果只混音频不混视频,客户端 SDK 中混流任务的 Width 和 Height 填 1 即可。服务端 REST API 同理。不要把 Width/Height 设为 0,会导致参数校验失败。
8.4 焦点语音对原流无影响
isAudioFocus 只在混流输出中生效。房间内其他用户如果拉的是独立流(非混流输出流),不会受到焦点语音的任何影响。
8.5 与其它音频能力的组合
焦点语音可以和以下 ZEGO 音频能力组合使用:
- 3A 处理(AEC/AGC/ANS):建议开启,确保输入流本身质量
- AI 降噪:在嘈杂环境下进一步过滤背景噪声
- 空间音效 / 范围音频:在焦点语音基础上增加方位感
九、总结
在 ZEGO 体系内实现”突出某个发言人声音”,核心公式只有三个参数:
混流 +
mixMode = focused+isAudioFocus = true
整个方案依赖服务端混流能力,所有拉流端统一生效,不需要各客户端自行协调音量。焦点发言人切换只需要在服务端更新一次混流参数,比其他方案更可控、更统一。
对于需要”主讲人模式”的多人会议、在线课堂、语聊房等场景,这个方案是目前最直接、最可靠的实现路径。
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/yinshipin/70042.html