Skip to main content

Overview

info

For 0.11.x, visit https://ffmpegwasm-0-11-x.netlify.app and 0.11.x branch.

Introduction

ffmpeg.wasm is a pure WebAssembly / JavaScript port of FFmpeg enabling video & audio record, convert and stream right inside browsers.

We leverage Emscripten to transpile FFmpeg source code and many libraries to WebAssembly and develop a minimal but essential library to free developers from common requirements like running ffmpeg inside web worker and more.

Advantages

  • Security: your users' data only lives inside their browser, no need to worry about any data leakage or network latency.
  • Client-side computing: instead of hosting a cluster of server-end servers, you can now offload multimedia processing to client-side.
  • Flexible: ffmpeg.wasm comes with single-thread and multi-thread cores, you can use whichever fits your use case.

Architecture

architecture

Multimedia transcoding is a resource-intensive task that you don't want to execute in main thread, thus in ffmpeg.wasm we offload those task to web worker (ffmpeg.worker) by default. This makes almost all function calls in ffmpeg.wasm are asynchronous and it is recommended to use async / await syntax.

ffmpeg.worker downloads WebAssembly code (ffmpeg-core) from CDN and initialized it in WorkerGlobalScope. For any input video file you would like to process, you need to first populated them inside ffmpeg-core File System and also read result from ffmpeg-core File System once it is done.

If you are using a multi-thread version of ffmpeg-core, more web workers will be spawned by ffmpeg-core inside ffmpeg.worker

info

The concept of core in ffmpeg.wasm is like the engine of a car, it is not only the most important part of ffmpeg.wasm but also a swappable component. Currently we maintain single-thread (@ffmpeg/core) and multi-thread version (@ffmpeg/core-mt) cores, you can build your own core (ex. a core with x264 lib only to minimize ffmpeg-core.wasm file size) using build scripts in the repository.

Packages

All ffmpeg.wasm packages are under @ffmpeg name space:

NameUsage
@ffmpeg/ffmpegffmpeg.wasm main package
@ffmpeg/utilcommon utility functions
@ffmpeg/typesTypeScript types
@ffmpeg/coresingle-thread ffmpeg.wasm core
@ffmpeg/core-mtmulti-thread ffmpeg.wasm core

Libraries

ffmpeg.wasm is built with toolchains / libraries:

NameVersionNote
Emscripten3.1.40
FFmpegn5.1.3
x2640.164.x
x2653.4
libvpxv1.9.0
lame3.100
oggv1.3.4
theorav1.1.1
opusv1.3.1
vorbisv1.3.3
zlibv1.2.11
libwebpv1.1.0
freetype2v2.10.4
fribidiv1.0.9
harfbuzz5.2.0
libass0.15.0