多人会议中如何突出某个发言人的声音:ZEGO 混流焦点语音方案详解

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

多人会议中如何突出某个发言人的声音:ZEGO 混流焦点语音方案详解

一、背景

做过多人在线会议或语聊房的开发者,大概率遇到过这些场景:

  • “主持人说话,背景里七嘴八舌,底下人听不清。”
  • “老师讲课,学生那边环境嘈杂,课堂体验很差。”
  • “线上答辩,当前汇报人的声音被其他参会者盖住了。”

这些场景的共同痛点是:房间内多人同时说话时,重要发言人的声音被淹没。解决这个问题的传统方式无非两种:让其他人手动闭麦(依赖自觉,体验割裂),或者在客户端调高某个人的音量(各端各自为政,无法统一控制)。前者依赖用户行为,后者只影响本地,都不算优雅的工程方案。

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,关键字段:

参数类型说明
streamIDString输入流的 ID
contentType枚举流类型:音频流 / 视频流 / 音视频流
isAudioFocusBoolean是否将该流标记为焦点语音流。 仅在 mixMode = focused 时生效
layoutObject该流在混流画面中的布局(纯音频混流可忽略)

4.3 服务端 REST API StartMix 等价参数

服务端 REST API 对应参数名和客户端 SDK 基本一致,差异仅在 JSON 字段命名风格(camelCase vs PascalCase),逻辑完全相同。

调用服务端混流 API 需要签名鉴权,具体可参考 ZEGO 服务端 API 签名文档。

五、实现步骤

以下以 iOS Objective-C 为例,其余平台 API 结构一致。

5.1 前提准备

  1. 在 ZEGO 控制台 创建项目,获取 AppID 和 ServerSecret
  2. 在控制台开通混流服务
  3. 完成 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

(0)

相关推荐