# AudioContext
# 简略的Audio
特点:简单音频播放/暂停、单线程。
<audio src="./song.mp3"></audio>
1
const audio = new Audio();
audio.src = './song.mp3';
1
2
2
更高级地控制音频:声道的合并与分割、音调、音频振幅压缩、混响等等,则需要 Web Audio Api。
# Web Audio Api
特点:音频合成/处理、模块化设计、可视化音频。
Web Audio API 可以通过 “音频节点(AudioNode)” 去处理 音频 ,多个音频节点 connect 到一起就形成了 “音频导向图”。
TIP
AudioContext(环境) 与AudioNode(模块) 的关系
=> 可以理解为: webpack (环境)与loader (模块) 的关系。
buffer
=> 可以理解为 js、css、image
# 音频合成/处理(Audio Context)
Audio Context 是 “音频播放和处理” 的上下文环境,包含一系列 “用来处理音频的 API”。
内置方法:创建 AudioNode、解码音频文件。
# AudioNode
AudioNode 是位于 source 、 destination 之间的一系列 “音频处理器”。
类型:
GainNode:音量处理器BiquadFilterNode:音调处理器PannerNode:3D环绕音效
const gainNode = audioContext.createGain();
const BiquadFilterNode = audioContext.createBiquadFilter();
const PanerNode = audioContext.createPanner();
1
2
3
4
5
2
3
4
5
source.connect(gainNode);
gainNode.connect(source.destination);
1
2
3
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
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