--- title: OfflineAudioContext slug: Web/API/OfflineAudioContext translation_of: Web/API/OfflineAudioContext ---
OfflineAudioContext
接口是一个 {{domxref("AudioContext")}} 的接口,代表由多个 {{domxref("AudioNode")}} 连接在一起构成的音频处理图。与 {{domxref("AudioContext")}} 标准相反的是, OfflineAudioContext
不在硬件设备渲染音频;相反,它尽可能快地生成音频,输出一个 {{domxref("AudioBuffer")}} 作为结果。
OfflineAudioContext
实例。从父级 {{domxref("AudioContext")}} 获取属性。
从父级 {{domxref("AudioContext")}} 和 {{domxref("EventTarget")}} 获取方法的实现。
这个简单的例子中,我们声明了 {{domxref("AudioContext")}} 和 OfflineAudioContext
对象。我们使用 AudioContext
去加载一个 XHR ({{domxref("AudioContext.decodeAudioData")}})获取的音轨,然后使用 OfflineAudioContext
去渲染音频并得到一个 into an {{domxref("AudioBufferSourceNode")}},并播放这个音轨。在离线音频处理图建立后,你需要去使用 {{domxref("OfflineAudioContext.startRendering")}} 来渲染它成为 {{domxref("AudioBuffer")}}。
当 startRendering()
的 Promise 解决后,渲染也完成了,在 Promise 内可以获得输出的 AudioBuffer。
在此刻,我们创建了一个另外的音频上下文,在它里面创建了一个 {{domxref("AudioBufferSourceNode")}},并且设置它的 buffer 为之前生成的 Promise 中的 AudioBuffer。这样它就可以作为简单标准音频图来播放了
。
注意: 为了获取可以运行的例子,请看我们在 Github 的仓库 offline-audio-context-promise (也可以看到 源代码。)
// 定义一个在线或者离线的音频上下文 var audioCtx = new AudioContext(); var offlineCtx = new OfflineAudioContext(2,44100*40,44100); source = offlineCtx.createBufferSource(); // 使用 XHR 去加载一个音轨, // 使用 decodeAudioData 去解码, // 使用 OfflineAudioContext 去渲染它 function getData() { request = new XMLHttpRequest(); request.open('GET', 'viper.ogg', true); request.responseType = 'arraybuffer'; request.onload = function() { var audioData = request.response; audioCtx.decodeAudioData(audioData, function(buffer) { myBuffer = buffer; source.buffer = myBuffer; source.connect(offlineCtx.destination); source.start(); //source.loop = true; offlineCtx.startRendering().then(function(renderedBuffer) { console.log('渲染完全成功'); var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); var song = audioCtx.createBufferSource(); song.buffer = renderedBuffer; song.connect(audioCtx.destination); play.onclick = function() { song.start(); } }).catch(function(err) { console.log('渲染失败: ' + err); // 注意: 当 OfflineAudioContext 上 startRendering 被立刻调用,Promise 应该被 reject }); }); } request.send(); } // 运行 getData 去开始这个进程 getData();
Specification | Status | Comment |
---|---|---|
{{SpecName('Web Audio API', '#OfflineAudioContext', 'OfflineAudioContext')}} | {{Spec2('Web Audio API')}} | Initial definition |
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|---|
Basic support | {{CompatChrome(10.0)}}{{property_prefix("webkit")}} | {{CompatVersionUnknown}} | {{CompatGeckoDesktop(25.0)}} | {{CompatNo}} | 15.0{{property_prefix("webkit")}} 22 (unprefixed) |
6.0{{property_prefix("webkit")}} |
Promise-based startRendering() |
{{CompatChrome(42.0)}} | {{CompatUnknown}} | {{CompatGeckoDesktop(37.0)}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
suspend() , resume() |
{{CompatChrome(49.0)}} | {{CompatUnknown}} | ||||
length |
{{CompatChrome(51.0)}} | {{CompatUnknown}} |
Feature | Android Webview | Firefox Mobile (Gecko) | Firefox OS | Edge | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|---|
Basic support | {{CompatChrome(33.0)}} | 26.0 | 1.2 | {{CompatVersionUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatVersionUnknown}} |
Promise-based startRendering() |
{{CompatChrome(42.0)}} | 37.0 | 2.2 | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatChrome(42.0)}} |
suspend() , resume() |
{{CompatChrome(49.0)}} | {{CompatUnknown}} | {{CompatChrome(49.0)}} | |||||
length |
{{CompatChrome(51.0)}} | {{CompatUnknown}} | {{CompatChrome(51.0)}} |