OfflineAudioContext
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2021.
OfflineAudioContext
接口是一个 AudioContext
的接口,代表由多个 AudioNode
连接在一起构成的音频处理图。与 AudioContext
标准相反的是,OfflineAudioContext
不在硬件设备渲染音频;相反,它尽可能快地生成音频,输出一个 AudioBuffer
作为结果。
构造函数
OfflineAudioContext()
-
创建一个新的
OfflineAudioContext
实例。
实例属性
从其父接口 BaseAudioContext
继承属性。
OfflineAudioContext.length
只读-
代表采样帧缓冲区大小的整数。
实例方法
从其父接口 BaseAudioContext
继承方法。
OfflineAudioContext.suspend()
-
在指定的时间安排音频暂停时间进程,并返回 Promise。
OfflineAudioContext.startRendering()
-
开始渲染音频,考虑当前连接和当前计划的修改。这个页面涵盖基于事件的和基于 Promise 的版本。
已弃用的方法
OfflineAudioContext.resume()
-
恢复一个被暂停的音频的时间进程。
备注: resume()
方法仍然是可用的——现在它定义在 BaseAudioContext
接口中(参见 AudioContext.resume
),通过AudioContext
接口和 OfflineAudioContext
接口都可以被访问。
事件
通过使用 addEventListener()
或给这个接口的 oneventname
属性指定一个事件监听器来监听这些事件。
complete
-
当离线音频上下文的渲染完成时触发。
示例
使用离线音频上下文播放音频
这个例子中,我们声明了 AudioContext
和 OfflineAudioContext
对象。我们使用 AudioContext
加载一个音轨的 fetch()
,然后使用 OfflineAudioContext
去渲染音频并得到一个 AudioBufferSourceNode
,并播放这个音轨。在离线音频处理图建立后,我们使用 OfflineAudioContext.startRendering
来将它渲染为 AudioBuffer
。
当 startRendering()
的 promise 兑现后,渲染也完成了,promise 会返回输出的 AudioBuffer
。
在此刻,我们创建了一个另外的音频上下文,在它里面创建了一个 AudioBufferSourceNode
,并且设置它的 buffer 为之前生成的 Promise 中的 AudioBuffer
,这样它就可以作为简单标准音频图来播放了。
// 定义一个在线或者离线的音频上下文
let audioCtx; // 必须在用户交互后初始化
const offlineCtx = new OfflineAudioContext(2, 44100 * 40, 44100);
// 定义 DOM 节点的常量
const play = document.querySelector("#play");
function getData() {
// 获取音频块,对其进行解码放入缓冲区。
// 然后我们把缓冲区放进 source 对象,就可以播放了。
fetch("viper.ogg")
.then((response) => response.arrayBuffer())
.then((downloadedBuffer) => audioCtx.decodeAudioData(downloadedBuffer))
.then((decodedBuffer) => {
console.log("文件下载成功。");
const source = new AudioBufferSourceNode(offlineCtx, {
buffer: decodedBuffer,
});
source.connect(offlineCtx.destination);
return source.start();
})
.then(() => offlineCtx.startRendering())
.then((renderedBuffer) => {
console.log("渲染完全成功。");
play.disabled = false;
const song = new AudioBufferSourceNode(audioCtx, {
buffer: renderedBuffer,
});
song.connect(audioCtx.destination);
// 启动 song
song.start();
})
.catch((err) => {
console.error(`遇到错误:${err}`);
});
}
// 激活播放按钮
play.onclick = () => {
play.disabled = true;
// 我们可以在用户单击时初始化上下文。
audioCtx = new AudioContext();
// 获取数据并启动 song
getData();
};
规范
Specification |
---|
Web Audio API # OfflineAudioContext |
浏览器兼容性
BCD tables only load in the browser