Skip to content

Repository files navigation

node-webcodecs

WebCodecs API for Node.js — encode and decode video/audio with browser-compatible APIs, powered by FFmpeg.

License: MITNode.js

Why node-webcodecs?

Featurenode-webcodecsBrowser WebCodecs
Video CodecsH.264, H.265, VP8, VP9, AV1Varies by browser
Audio CodecsAAC, Opus, MP3, FLACVaries by browser
Container MuxingMP4Not in spec
DemuxingAny FFmpeg formatNot in spec
Server-sideYesBrowser only

Installation

npm install @pproenca/node-webcodecs

Prebuilt binaries with FFmpeg statically linked are included for:

  • macOS ARM64 (Apple Silicon)
  • macOS x64 (Intel)
  • Linux x64 (musl, fully static)
Building from Source

For other platforms or to force a source build:

npm install @pproenca/node-webcodecs --build-from-source

This requires FFmpeg 5.0+ development libraries:

macOS:

brew install ffmpeg pkg-config

Ubuntu/Debian:

sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev \
libswscale-dev libswresample-dev libavfilter-dev pkg-config

Fedora/RHEL:

sudo dnf install ffmpeg-devel pkg-config

Quick Start

Encode

import{VideoEncoder,VideoFrame}from"@pproenca/node-webcodecs";constencoder=newVideoEncoder({output: (chunk)=>chunks.push(chunk),error: console.error,});encoder.configure({codec: "avc1.42001e",width: 1920,height: 1080,bitrate: 5_000_000,});constframe=newVideoFrame(rgbaBuffer,{format: "RGBA",codedWidth: 1920,codedHeight: 1080,timestamp: 0,});encoder.encode(frame);frame.close();awaitencoder.flush();

Decode

import{VideoDecoder,EncodedVideoChunk}from"@pproenca/node-webcodecs";constdecoder=newVideoDecoder({output: (frame)=>{// Process frame...frame.close();},error: console.error,});decoder.configure({codec: "avc1.42001e",codedWidth: 1920,codedHeight: 1080,});decoder.decode(newEncodedVideoChunk({type: "key",timestamp: 0, data }));awaitdecoder.flush();

Mux to MP4

import{Muxer}from"@pproenca/node-webcodecs";constmuxer=newMuxer({filename: "output.mp4"});muxer.addVideoTrack({codec: "avc1.42001e",width: 1920,height: 1080,description: codecDescription,});muxer.writeVideoChunk(chunk);muxer.finalize();

Demux

import{Demuxer}from"@pproenca/node-webcodecs";constdemuxer=newDemuxer({onTrack: (track)=>console.log(track.codec),onChunk: (chunk,trackIndex)=>decoder.decode(chunk),onError: console.error,});demuxer.open("input.mp4");demuxer.demux();demuxer.close();

See examples/ for complete working code.

API

This library implements the W3C WebCodecs specification.

ClassDescription
VideoEncoder / VideoDecoderCompress / decompress video
AudioEncoder / AudioDecoderCompress / decompress audio
VideoFrame / AudioDataRaw media containers
EncodedVideoChunk / EncodedAudioChunkCompressed media packets
ImageDecoderDecode JPEG, PNG, WebP, GIF
Muxer / DemuxerContainer I/O (beyond W3C spec)

Video codecs: H.264, H.265, VP8, VP9, AV1 Audio codecs: AAC, Opus, MP3 (decode), FLAC (decode)

See docs/codecs.md for codec strings and pixel formats.

See docs/best-practices.md for resource management, error handling, and queue management guidance.

Contributing

See CONTRIBUTING.md.

License

MIT

About

WebCodecs API implementation for Node.js using FFmpeg - k Challenge Entry

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages