核心是将含活跃音频轨道的mediastream(本地getusermedia或远程webrtc track)接入audiocontext,通过createmediastreamsource()创建只读源节点并连接至分析/处理节点;需确保audiocontext运行、流有启用音频轨、避免多轨传入safari。

使用 AudioContext 的 MediaStreamAudioSourceNode 处理直播流,核心是把来自摄像头/麦克风(或远程 WebRTC 流)的 MediaStream 音频轨道接入 Web Audio API 进行实时分析、混音、滤波等操作。它本身不处理“直播协议”(如 HLS、RTMP),而是处理已解码为 PCM 的音频流。
获取有效的 MediaStream 音频源
必须确保你拿到的是包含**活跃音频轨道**的 MediaStream:
- 本地采集:用
navigator.mediaDevices.getUserMedia({audio: true})获取用户授权后的流; - 远程 WebRTC:从
RTCPeerConnection的ontrack事件中提取event.track,再用new MediaStream([track])构建单轨流; - 注意:不能直接用
<video></video>或<audio></audio>元素的srcObject创建源节点——需显式提取音频轨道,例如:const audioStream = new MediaStream(stream.getAudioTracks());
创建并连接 MediaStreamAudioSourceNode
该节点是只读输入源,**不可重复使用**,且必须在 AudioContext 运行状态下创建:
- 先调用
audioContext.resume()(尤其在用户交互后); - 用
audioContext.createMediaStreamSource(stream)创建节点; - 它没有输入,只有输出,必须连接到后续节点(如
GainNode、BiquadFilterNode或AnalyserNode); - 示例:
const source = audioContext.createMediaStreamSource(audioStream);<br>source.connect(analyser); // 或 connect(gain).connect(destination);
实时处理与注意事项
直播流持续推送音频帧,因此处理逻辑需保持低延迟、避免阻塞:
- 若做音频分析(如频谱、响度),用
AnalyserNode+getByteFrequencyData()在requestAnimationFrame中读取; - 避免在主线程做重计算(如 FFT);可考虑
OffscreenCanvas或 Web Worker 配合; - 流停止时(如 track.muted、ended 或 connection 关闭),
MediaStreamAudioSourceNode自动静音,但建议手动disconnect()并清理引用; - 不支持 Safari 对
createMediaStreamSource传入多轨流(含视频轨)——务必只传纯音频流。
常见问题排查
如果没声音或报错,优先检查:
-
audioContext.state是否为"running"(否则调用resume()); -
stream.getAudioTracks().length > 0且track.enabled === true; - 浏览器是否屏蔽了自动播放(未用户手势触发时
destination不发声); - WebRTC 流中 track 的
readyState是否为"live",而非"ended"。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











