/Web APIs


The OfflineAudioContext interface is an AudioContext interface representing an audio-processing graph built from linked together AudioNodes. In contrast with a standard AudioContext, an OfflineAudioContext doesn't render the audio to the device hardware; instead, it generates it, as fast as it can, and outputs the result to an AudioBuffer.

EventTarget BaseAudioContext OfflineAudioContext



Creates a new OfflineAudioContext instance.

Instance properties

Also inherits properties from its parent interface, BaseAudioContext.

OfflineAudioContext.length Read only

An integer representing the size of the buffer in sample-frames.

Instance methods

Also inherits methods from its parent interface, BaseAudioContext.


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


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.

Deprecated methods


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

Note: The resume() method is still available — it is now defined on the BaseAudioContext interface (see AudioContext.resume) and thus can be accessed by both the AudioContext and OfflineAudioContext interfaces.


Listen to these events using addEventListener() or by assigning an event listener to the oneventname property of this interface:


Fired when the rendering of an offline audio context is complete.


In this simple example, we declare both an AudioContext and an OfflineAudioContext object. We use the AudioContext to load an audio track via XHR (BaseAudioContext.decodeAudioData), then the OfflineAudioContext to render the audio into an AudioBufferSourceNode and play the track through. After the offline audio graph is set up, you need to render it to an AudioBuffer using OfflineAudioContext.startRendering.

When the startRendering() promise resolves, rendering has completed and the output AudioBuffer is returned out of the 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.

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

// define online and offline audio context

const audioCtx = new AudioContext();
const offlineCtx = new OfflineAudioContext(2, 44100 * 40, 44100);

source = offlineCtx.createBufferSource();

// use XHR to load an audio track, and
// decodeAudioData to decode it and OfflineAudioContext to render it

function getData() {
  request = new XMLHttpRequest();

  request.open("GET", "viper.ogg", true);

  request.responseType = "arraybuffer";

  request.onload = () => {
    const audioData = request.response;

    audioCtx.decodeAudioData(audioData, (buffer) => {
      myBuffer = buffer;
      source.buffer = myBuffer;
      //source.loop = true;
        .then((renderedBuffer) => {
          console.log("Rendering completed successfully");
          const song = audioCtx.createBufferSource();
          song.buffer = renderedBuffer;


          play.onclick = () => {
        .catch((err) => {
          console.error(`Rendering failed: ${err}`);
          // Note: The promise should reject when startRendering is called a second time on an OfflineAudioContext


// Run getData to start the process off



Browser compatibility

Desktop Mobile
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on IOS Samsung Internet
OfflineAudioContext 3525–57 12 25 No 2215–44 14.17–14.1 374.4–57 3525–57 25 2214–43 14.57–14.5 3.01.5–7.0
OfflineAudioContext 3525–57 12 25 No 2215–44 14.17–14.1 374.4–57 3525–57 25 2214–43 14.57–14.5 3.01.5–7.0
complete_event 25 12 25 No 15 7 4.4 25 25 14 7 1.5
length 51 14 49 No 38 14.1 51 51 49 41 14.5 5.0
resume 41 14 40 No 28 9 41 41 40 28 9 4.0
startRendering 25 12 25 No 15 7 4.4 25 25 14 7 1.5
suspend 41 14
NoSee bug 1265406.
No 28 9 41 41
NoSee bug 1265406.
28 9 4.0

See also

© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.