# AudioContext

# 简略的Audio

特点:简单音频播放/暂停、单线程。

<audio src="./song.mp3"></audio>
1
const audio = new Audio();
audio.src = './song.mp3';
1
2

更高级地控制音频:声道的合并与分割、音调、音频振幅压缩、混响等等,则需要 Web Audio Api

# Web Audio Api

特点:音频合成/处理、模块化设计、可视化音频。

Web Audio API 可以通过 “音频节点(AudioNode)” 去处理 音频 ,多个音频节点 connect 到一起就形成了 “音频导向图”。

TIP

  1. AudioContext(环境) 与 AudioNode(模块) 的关系

=> 可以理解为: webpack (环境)与loader (模块) 的关系。

  1. buffer

=> 可以理解为 js、css、image

# 音频合成/处理(Audio Context)

Audio Context 是 “音频播放和处理” 的上下文环境,包含一系列 “用来处理音频的 API”。

内置方法:创建 AudioNode、解码音频文件。

# AudioNode

AudioNode 是位于 sourcedestination 之间的一系列 “音频处理器”。

类型:

  • GainNode:音量处理器
  • BiquadFilterNode:音调处理器
  • PannerNode:3D环绕音效
const gainNode = audioContext.createGain();

const BiquadFilterNode = audioContext.createBiquadFilter();

const PanerNode = audioContext.createPanner();
1
2
3
4
5

source.connect(gainNode);
gainNode.connect(source.destination);
1
2
3

# API

decodeAudioData:解码音频文件。把 “音频数据” 转成 “buffer” (“音频数据”为由请求 './song.mp3' 后的响应)

  • 入参:(data, callback)
  • 出参:buffer(传入callback参数)

createBufferSource: 创建 source 节点

const URL = 'path/to/music.mp3';
const audioContext = new AudioContext();
const playAudio = function (buffer) {
   const source = audioContext.createBufferSource();
   source.buffer = buffer;
   source.connect(audioContext.destination);
   source.start();
};
const getBuffer = function (url) {
   const request = new XMLHttpRequest();
   return new Promise((resolve, reject) => {
request.open('GET', url, true);
       request.responseType = 'arraybuffer';
       request.onload = () => {
           audioContext.decodeAudioData(request.response, buffer => buffer ? resolve(buffer) : reject('decoding error'));
       };
       request.onerror = error => reject(error);
       request.send();
   });
};
const buffer = await getBuffer(URL);
buffer && playAudio(buffer);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  • buffer: audioContext.decodeAudioBuffer()
  • source: audioContext.createBufferSource()
  • connect: source.connect
  • destination: audioContext.destination

# 模块化设计

  • 一个音频源source,可以使用多个处理器audioNode
  • 多个音频源source,可以合并为一个输出destination

# 参考

更新时间: 11/21/2021, 2:45:24 AM