摘要:直播场景中,主播声音被连麦观众或背景噪声盖住是常见的体验问题。本文聚焦直播特有的工程约束(流动态增减、CDN 推流、PK 连麦频繁切换)提出基于 ZEGO 自动混流(Auto Mix)的焦点语音方案。相比手动混流,自动混流在直播中维护成本更低,主播流标记 IsAudioFocus 后即可锁定焦点,连麦观众加入/离开均无需手动更新混流任务。包含服务端 REST API(curl/Node.js)调用示例,以及 PK、秀场、电商直播等子场景的焦点策略对照。适合语聊房、秀场、电商直播等场景的开发者。

一、背景
做直播的开发者可能会遇到以下场景:
- “主播正在讲解商品,连麦观众那边小孩在哭,直播间瞬间炸了。”
- “PK 连麦时,对方主播声音太大,自己主播说话完全听不清。”
- “语聊房里,当前麦位上的用户在唱歌,背景里其他人聊天的声音混进去了。”
直播场景和普通多人会议有一个关键区别:有明确的”主次”关系。主播是内容的核心输出者,其他声音(连麦观众、背景音乐、音效)应该围绕主播存在,而不是和主播抢注意力。
但现实情况是,当直播间同时存在多路音频流(主播放流、连麦观众流、BGM),如果只是简单混音叠加,谁嗓门大谁占上风,主播声音一旦被盖住,整个直播间的体验就塌了。
ZEGO 实时音视频 SDK (ZEGO Express SDK) 的混流焦点语音专门解决”多路音频中的主次关系”问题。这篇文章聚焦直播场景的具体落地。
二、直播场景的特殊性
直播和会议的混流需求有几个本质差异:
第一,输出目标不同。 会议的混流输出主要给房间内用户消费;直播的混流需要推到 CDN,供成千上万观众观看。这意味着混流的稳定性、延迟和成本都需要重新考量。
第二,混流方式不同。 会议通常需要手动指定哪些流参与混流(精确控制);直播更倾向于自动混流:房间内所有音频流自动聚合,主播流为焦点,动态加入/退出不需要手动管理。
第三,焦点切换模式不同。 会议的焦点切换是低频、可预期的(轮流汇报);直播的焦点切换可能是高频、事件驱动的,比如连麦观众说完了、PK 结束了、新观众上麦每次都要快速切换。
第四,有”单人模式”。 很多直播在大部分时间里,房间里只有一个主播在说话。这种场景不需要混流焦点语音,单流推 CDN 即可。真正需要的是”主播 + 连麦”的混合场景。
三、方案架构:自动混流 + 焦点语音
直播场景推荐使用 ZEGO 的自动混流(Auto Mix),而不是手动混流。两者区别:
| 维度 | 自动混流 | 手动混流 |
|---|---|---|
| 流管理 | 房间内流自动聚合,有新流自动加入 | 每次需手动指定 InputList |
| 适用场景 | 直播、语聊房(流动态变化) | 会议、课堂(流相对固定) |
| 焦点语音 | 通过 ExtraMixInput 标记焦点流 | 通过 MixInput.IsAudioFocus 标记 |
| 维护成本 | 低(ZEGO 自动管理流增减) | 高(流变化需重新调用接口) |
架构示意
直播间 room_live_001:
主播推流 (stream_anchor) ──────┐ isAudioFocus = true
连麦观众 D 推流 (stream_guest) ─┤ isAudioFocus = false
BGM 流 (stream_bgm) ───────────┘ isAudioFocus = false
↓
ZEGO 自动混流引擎
mixMode = focused
↓
输出混流 → 推到 CDN (RTMP/HLS/FLV)
↓
数万观众看到同一路流:主播声音突出
关键点:主播流永远是焦点,无论有多少连麦观众加入或离开,主播声音始终在最前面。
四、关键 API 与参数
自动混流在服务端通过 StartAutoMix 接口发起。焦点语音相关的核心参数:
4.1 Audio 配置
{
"Audio": {
"MixMode": "focused"
}
}
4.2 标记焦点流(通过 ExtraMixInput)
和手动混流不同,自动混流不需要列出所有房间内流,ZEGO 会自动聚合。但你仍可以指定哪些流需要特殊处理:
{
"ExtraMixInput": [
{
"StreamId": "stream_anchor",
"ContentType": "audio",
"IsAudioFocus": true
}
]
}
ExtraMixInput 的作用:在不影响自动聚合逻辑的前提下,对特定流附加配置。
4.3 排除某条流
连麦场景中,可能有一路流你不想让它参与混流(比如调试流、监控流):
{
"RemoveMixInput": [
{
"StreamId": "stream_monitor",
"ContentType": "audio"
}
]
}
五、实现步骤
5.1 前提准备
- ZEGO 控制台开通混流服务和自动混流权限
- 获取 AppID、ServerSecret
- 实现服务端 API 签名(参考 ZEGO 签名文档)
5.2 发起自动混流(焦点模式,主播为主)
curl -X POST "https://rtc-api.zego.im/?Action=StartAutoMix" \
-H "Content-Type: application/json" \
-H "Signature: ..." \
-d '{
"AppId": 1234567890,
"RoomId": "live_room_001",
"TaskId": "auto_mix_task_001",
"Audio": {
"MixMode": "focused"
},
"ExtraMixInput": [
{
"StreamId": "stream_anchor",
"ContentType": "audio",
"IsAudioFocus": true
}
],
"Output": [
{
"StreamId": "mix_output_live",
"ContentType": "audio"
}
]
}'
5.3 连麦场景:观众上麦
当有观众申请上麦并被主播同意后,不需要修改混流任务,自动混流会自动将新流聚合进去。由于主播流已经被标记为焦点,新加入的连麦观众流默认 isAudioFocus = false,音量不会压过主播。
观众上麦流程:
1. 观众推流到房间
2. 自动混流自动检测到新流,聚合到混流输出
3. 主播声音仍然突出(isAudioFocus = true 保持不变)
4. 连麦结束,观众断流,自动混流自动移除该流
这就是自动混流的核心优势:主播始终是焦点,流增减不需要手动维护。
5.4 PK 场景:焦点切换
PK 是直播中最常见的焦点切换场景。两个主播连麦 PK,焦点需要从自己主播切换到对方主播(或双方同时为焦点):
# PK 开始:将对方主播也设为焦点(双焦点模式)
curl -X POST "https://rtc-api.zego.im/?Action=UpdateAutoMix" \
-H "Content-Type: application/json" \
-d '{
"AppId": 1234567890,
"RoomId": "live_room_001",
"TaskId": "auto_mix_task_001",
"ExtraMixInput": [
{
"StreamId": "stream_anchor",
"ContentType": "audio",
"IsAudioFocus": true
},
{
"StreamId": "stream_pk_opponent",
"ContentType": "audio",
"IsAudioFocus": true
}
]
}'
PK 结束后,再将对方主播的 IsAudioFocus 改为 false 或从 ExtraMixInput 中移除。
六、完整调用示例(Node.js)
const crypto = require('crypto');
// 签名函数(参考 ZEGO 服务端签名文档)
function generateSignature(appId, serverSecret, params) {
// 签名逻辑见 ZEGO 文档
}
// 发起自动混流
async function startAutoMixWithFocus(roomId, anchorStreamId) {
const params = {
AppId: 1234567890,
RoomId: roomId,
TaskId: `auto_mix_${roomId}`,
Audio: {
MixMode: 'focused',
},
ExtraMixInput: [
{
StreamId: anchorStreamId,
ContentType: 'audio',
IsAudioFocus: true,
},
],
Output: [
{
StreamId: `mix_output_${roomId}`,
ContentType: 'audio',
},
],
};
// 生成签名、发起请求...
return params;
}
// PK 切换:临时将对方主播设为焦点
async function switchFocusForPK(roomId, pkOpponentStreamId) {
// 动态更新自动混流,追加焦点流
const updateParams = {
AppId: 1234567890,
RoomId: roomId,
TaskId: `auto_mix_${roomId}`,
ExtraMixInput: [
{ StreamId: `stream_anchor_${roomId}`, ContentType: 'audio', IsAudioFocus: true },
{ StreamId: pkOpponentStreamId, ContentType: 'audio', IsAudioFocus: true },
],
};
// 调用 UpdateAutoMix...
}
七、适用子场景
| 子场景 | 焦点策略 | 混流方式 |
|---|---|---|
| 单人直播(无连麦) | 不需要混流,单流推 CDN | 无 |
| 主播 + 连麦观众 | 主播固定焦点,观众有麦但不突出 | 自动混流 |
| PK 连麦 | 双方主播均为焦点 | 自动混流 + 动态更新 |
| 语聊房(轮流上麦) | 当前麦位用户为焦点,自动切换 | 自动混流 + 麦位事件触发 |
| 秀场直播(主播+礼物+BGM) | 主播焦点,BGM 不标记 | 自动混流 |
| 电商直播(主播讲解+助理配合) | 主主播焦点,助理不标或弱焦点 | 手动混流(需要精确布局) |
八、注意事项
8.1 自动混流 vs 手动混流的选择
直播场景优先选自动混流,除非:
- 需要精确的视频布局控制(如电商直播的画中画)
- 需要排除某些特定流不参与混流
- 混流输出需要推到多个 CDN 地址
8.2 CDN 推流的延迟
自动混流输出推到 CDN 后,观众端有 2~5 秒的播放延迟。如果连麦互动需要极低延迟(< 400ms),观众应直接加入 RTC 房间拉流,而不是通过 CDN 拉混流。
8.3 成本控制
自动混流按分钟计费。如果主播大部分时间在单人直播,建议在连麦开始时才创建混流任务,连麦结束后立即停止,避免空转计费。
开播 → 单人直播(不混流)
检测到连麦 → 创建自动混流任务
连麦结束 → 停止混流任务
下播
8.4 焦点数量
focused 模式没有限制焦点流的数量,但从听觉效果考虑,焦点数量控制在 1~2 路为佳。焦点太多等于没有焦点。
九、总结
直播场景突出主播声音的核心方案:
自动混流 +
MixMode = focused+ 主播流IsAudioFocus = true
和会议场景相比,直播更推荐自动混流:
- 流增减自动管理,降低维护成本
- 主播永远锁定焦点,连麦变化零维护
- PK 场景通过
UpdateAutoMix动态切换焦点
一句话:把主播流挂上 IsAudioFocus,剩下的交给自动混流。
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/info/70045.html