离线音频上下文:startRendering() 方法

基线 广泛可用

此功能已成熟稳定,可在许多设备和浏览器版本上运行。它自 2021 年 4 月.

startRendering() 方法是 OfflineAudioContext 接口的方法,用于开始渲染音频图,同时考虑当前连接和当前计划的更改。

当渲染完成时,将触发 complete 事件(类型为 OfflineAudioCompletionEvent),事件中包含作为 renderedBuffer 属性的结果 AudioBuffer

当前,浏览器支持两种版本的 startRendering() 方法 - 一个较旧的基于事件的版本和一个较新的基于 promise 的版本。前者最终会被删除,但目前出于向后兼容性的原因,两种机制都提供。

语法

js
startRendering()

参数

无。

返回值

一个 Promise,它将用 AudioBuffer 作为结果来完成。

示例

使用离线音频上下文播放音频

在此示例中,我们声明了 AudioContextOfflineAudioContext 对象。我们使用 AudioContext 加载音频轨 fetch(),然后使用 OfflineAudioContext 将音频渲染到 AudioBufferSourceNode 并播放音频轨。在设置离线音频图后,我们使用 OfflineAudioContext.startRendering() 将其渲染为 AudioBuffer

startRendering() promise 解决时,渲染已完成,输出 AudioBuffer 从 promise 中返回。

此时,我们创建另一个音频上下文,在其中创建一个 AudioBufferSourceNode,并将其缓冲区设置为等于 promise AudioBuffer。然后,它作为简单的标准音频图的一部分进行播放。

注意:您可以在 运行完整的示例,或 查看源代码

js
// Define both online and offline audio contexts
let audioCtx; // Must be initialized after a user interaction
const offlineCtx = new OfflineAudioContext(2, 44100 * 40, 44100);

// Define constants for dom nodes
const play = document.querySelector("#play");

function getData() {
  // Fetch an audio track, decode it and stick it in a buffer.
  // Then we put the buffer into the source and can play it.
  fetch("viper.ogg")
    .then((response) => response.arrayBuffer())
    .then((downloadedBuffer) => audioCtx.decodeAudioData(downloadedBuffer))
    .then((decodedBuffer) => {
      console.log("File downloaded successfully.");
      const source = new AudioBufferSourceNode(offlineCtx, {
        buffer: decodedBuffer,
      });
      source.connect(offlineCtx.destination);
      return source.start();
    })
    .then(() => offlineCtx.startRendering())
    .then((renderedBuffer) => {
      console.log("Rendering completed successfully.");
      play.disabled = false;
      const song = new AudioBufferSourceNode(audioCtx, {
        buffer: renderedBuffer,
      });
      song.connect(audioCtx.destination);

      // Start the song
      song.start();
    })
    .catch((err) => {
      console.error(`Error encountered: ${err}`);
    });
}

// Activate the play button
play.onclick = () => {
  play.disabled = true;
  // We can initialize the context as the user clicked.
  audioCtx = new AudioContext();

  // Fetch the data and start the song
  getData();
};

规范

规范
Web 音频 API
# dom-offlineaudiocontext-startrendering

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅