OfflineAudioContext

OfflineAudioContext インターフェイスは AudioContext インターフェイスの一種で、AudioNode をつなげて造られる音声処理グラフを表しています。通常の AudioContext と異なり、OfflineAudioContext で処理された音声はハードウェアから再生されることはありません。処理された結果は AudioBuffer に出力されます。

EventTarget BaseAudioContext OfflineAudioContext

コンストラクター

OfflineAudioContext.OfflineAudioContext() (en-US)

新しい OfflineAudioContext のインスタンスを作成します。

プロパティ

親インターフェイスである BaseAudioContext からのプロパティも継承します。

OfflineAudioContext.length (en-US) 読取専用

サンプルフレーム数で表されるバッファの大きさの整数値。

イベントハンドラー

OfflineAudioContext.oncomplete (en-US)

処理終了時に呼ばれる event handler イベントハンドラーです。 complete (en-US) イベント (型は OfflineAudioCompletionEvent (en-US) )を受け取ります。このイベントは、OfflineAudioContext.startRendering() (en-US) のイベント駆動型が利用された場合、処理終了時に送出さます。

メソッド

親インターフェースである BaseAudioContext からのメソッドも継承します。

OfflineAudioContext.resume() (en-US)

Resumes the progression of time in an audio context that has previously been suspended.

OfflineAudioContext.suspend() (en-US)

Schedules a suspension of the time progression in the audio context at the specified time and returns a promise.

OfflineAudioContext.startRendering() (en-US)

Starts rendering the audio, taking into account the current connections and the current scheduled changes. This page covers both the event-based version and the promise-based version.

この例では、AudioContextOfflineAudioContext 二つのオブジェクトを作っています。AudioContext は XHR (AudioContext.decodeAudioData)でオーディオトラックを読み込むのに使い、OfflineAudioContextAudioBufferSourceNode の中に音声をレンダリングし、そしてその音声を再生します。オフライン音声グラフのセットアップが終わった後、OfflineAudioContext.startRendering (en-US) を使って AudioBuffer にレンダリングする必要があります。

startRendering() の Promise が解決されるとレンダリングは完了し、出力結果の AudioBuffer が Promise の結果として戻されます。

At this point we create another audio context, create an AudioBufferSourceNode inside it, and set its buffer to be equal to the promise AudioBuffer. This is then played as part of a simple standard audio graph.

メモ: For a working example, see our offline-audio-context-promise Github repo (see the source code too.)

// オンラインとオフラインのオーディオコンテキストを定義

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('Rendering completed successfully');
        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('Rendering failed: ' + err);
          // 注意: OfflineAudioContext の startRendering が二回以上呼び出されるとPromise はリジェクトされます。
      });
    });
  }

  request.send();
}

// getData で処理を開始する。

getData();

仕様書

Specification
Web Audio API
# OfflineAudioContext

ブラウザーの対応

BCD tables only load in the browser

関連情報