2 min read

WebCodecs API

The WebCodecs API provides low-level access to the individual frames of a video stream and chunks of audio. It gives web developers the ability to encode and decode video and audio using the browser's built-in codecs (like H.264, VP8, VP9, AV1, AAC, Opus, etc.).

1. Why WebCodecs?

Before WebCodecs, web apps had to rely on high-level APIs like <video> or WebRTC, or use slow, WASM-compiled software codecs if they needed frame-level manipulation. WebCodecs exposes the efficient, hardware-accelerated media components already present in the browser.

Use cases include:

  • Video editing in the browser.
  • Low-latency game streaming.
  • Real-time video processing (AI/ML).

2. Video Decoding

To decode video, you use VideoDecoder.

const decoder = new VideoDecoder({
  output: (frame) => {
    // frame is a VideoFrame object
    console.log('Decoded frame:', frame);

    // Draw to canvas, process, etc.
    // ctx.drawImage(frame, 0, 0);

    frame.close(); // Important: Release memory!
  },
  error: (e) => console.error(e),
});

// Configure the decoder
decoder.configure({
  codec: 'vp8',
  codedWidth: 640,
  codedHeight: 480,
});

// Feed chunks to the decoder (e.g., from a file or network stream)
// chunk is an EncodedVideoChunk
// decoder.decode(chunk);

3. Video Encoding

To encode video frames into chunks, you use VideoEncoder.

const encoder = new VideoEncoder({
  output: (chunk, metadata) => {
    // chunk is an EncodedVideoChunk
    console.log('Encoded chunk size:', chunk.byteLength);
    // Send chunk to server or mux into a file
  },
  error: (e) => console.error(e),
});

encoder.configure({
  codec: 'vp8',
  width: 640,
  height: 480,
  bitrate: 2_000_000, // 2 Mbps
  framerate: 30,
});

// Create a VideoFrame (e.g., from a Canvas or ImageBitmap)
// const frame = new VideoFrame(canvas, { timestamp: 0 });

// Encode the frame
// encoder.encode(frame, { keyFrame: true });
// frame.close();

4. Audio

Similar interfaces exist for audio: AudioDecoder and AudioEncoder. They work with AudioData (raw audio) and EncodedAudioChunk.

5. Integration with Streams

WebCodecs works well with the Streams API (ReadableStream, WritableStream) to process media pipelines efficiently.

programming/javascript/vanilla/javascript programming/javascript/vanilla/streams-api programming/javascript/vanilla/canvas-api