You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web Audio API:将立体声流转单声道且保留原音频的问题

解决Chrome TabCapture立体声转单声道并保留原音频的问题

你之前的尝试都没成功,核心问题是没有正确分离并提取单个声道。以下是可行的实现方案:

问题分析

  • 第一种方法里createChannelSplitter(1)参数错误,源是2声道,必须传入2才能分离左右声道,否则无法正确拆分。
  • 第二种方法直接将2声道源连接到1声道合并器,浏览器会自动将双声道混音后仍输出2声道,达不到单声道效果。
  • 第三种方法给createMediaStreamDestination传的参数不生效,因为该方法的配置无法强制修改输出声道数,必须通过声道处理节点来实现。

正确实现代码

// 确保在用户交互后创建AudioContext(Chrome限制)
const context = new AudioContext();

// 从tabCapture获取的立体声流
const source = context.createMediaStreamSource(stream);
// 创建声道分离器(适配2声道输入)
const splitter = context.createChannelSplitter(2);
// 创建声道合并器(输出1声道)
const merger = context.createChannelMerger(1);
// 创建输出媒体流目标
const dest = context.createMediaStreamDestination();

// 源连接到分离器,提取左声道(索引0)到合并器
source.connect(splitter);
splitter.connect(merger, 0, 0); // 取左声道(分离器第0个输出)连到合并器的第0个输入

// 合并器连接到输出目标,得到单声道流
merger.connect(dest);

// 源直接连接到context.destination,保持原音频播放不变
source.connect(context.destination);

// 现在检查声道数,应该为1
console.log(dest.stream.getAudioTracks()[0].getSettings()); // channelCount: 1

额外说明

  • 如果需要提取右声道,把splitter.connect(merger, 0, 0)改成splitter.connect(merger, 1, 0)即可。
  • 如果需要将左右声道混音成单声道,可以同时把分离器的0和1输出都连到合并器的0输入,浏览器会自动完成混音。

内容的提问来源于stack exchange,提问作者fseb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:10:25