# 音频输入和输出
一个图至少由两个节点组成,这里我们从最简单的场景着手,也就是输入节点直接连接到输出。
# 音频上下文
const audioCtx = new AudioContext();
const audioEl = new Audio();
const audioSourceNode = audioCtx.createMediaElementSource(audioEl);
const audioDestNode = audioCtx.destination;
audioSourceNode.connect(audioDestNode);
# 做个测试
将两个不同音频上下文的节点相连会怎样 ?
let audioCtx = new AudioContext();
let audioCtx2 = new AudioContext();
// ...
const audioDestNode2 = audioCtx2.destination;
audioSourceNode.connect(audioDestNode2);
会提示如下内容
cannot connect to an AudioNode belonging to a different audio context
# 音频源
# 媒体元素
MediaElementAudioSourceNode
媒体元素音频源接口,代表来自 HTML 媒体元素 <audio>
,<video>
的音频源
const $audio = new Audio();
const audioSourceNode = audioCtx.createMediaElementSource($audio);
# 振荡器
OscillatorNode
振荡器接口,用于产生波形(发生器)
OscillatorNode()
构造函数创建一个新对象,该对象表示周期性波形,如正弦波,可选择设置节点的属性值以匹配指定对象中的值
const oscillatorNode = new OscillatorNode(audioCtx, options);
options
- type 节点产生的波的形状,默认为
sine
。可选值:sine
square
sawtooth
triangle
custom
- frequency 周期性波形的频率,单位是
Hz
。 默认值是 440.
# 媒体流
MediaStreamAudioSourceNode
媒体流音频源接口,表示来自 MediaStream 的音频源,比如 WebRTC,本地麦克风。
# 音频缓冲
AudioBuffer
代表一段音频数据
可以通过 AudioContext.decodeAudioData()方法从音频文件创建
AudioBufferSourceNode
音频缓存源接口,表示一段音频数据组成的音频源
AudioBufferSourceNode 接口继承自 AudioScheduledSourceNode,表现为一个音频源,它包含了一些写在内存中的音频数据,通常储存在一个 ArrayBuffer 对象中。
async function loadSound(audioCtx, url) {
const response = await fetch(url);
// Turn into an array buffer of raw binary data
const buffer = await response.arrayBuffer();
// Decode the entire binary MP3 into an AudioBuffer
const audioBuffer = await audioCtx.decodeAudioData(buffer);
return audioBuffer;
}
async function init() {
const audioBuffer = await loadSound("https://...");
await audioContext.resume();
const source = audioContext.createBufferSource();
// Assign the loaded buffer
source.buffer = audioBuffer;
// Connect to destination
source.connect(audioContext.destination);
// play
source.start(0);
}