直播场景中如何突出主播的声音:ZEGO 混流焦点语音实战

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

直播场景中如何突出主播的声音:ZEGO 混流焦点语音实战

一、背景

做直播的开发者可能会遇到以下场景:

  • “主播正在讲解商品,连麦观众那边小孩在哭,直播间瞬间炸了。”
  • “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 前提准备

  1. ZEGO 控制台开通混流服务自动混流权限
  2. 获取 AppID、ServerSecret
  3. 实现服务端 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

(0)

相关推荐