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.
- 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.
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
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.
All ffmpeg.wasm packages are under @ffmpeg name space:
|@ffmpeg/ffmpeg||ffmpeg.wasm main package|
|@ffmpeg/util||common utility functions|
|@ffmpeg/core||single-thread ffmpeg.wasm core|
|@ffmpeg/core-mt||multi-thread ffmpeg.wasm core|
ffmpeg.wasm is built with toolchains / libraries:
|FFmpeg||n5.1.3||FFmpeg is a powerful multimedia framework that can decode, encode, transcode, and stream audio and video files. It's widely used for media manipulation and streaming.|
|x264||0.164.x||x264 is a popular video encoding library that provides high-quality H.264 video compression. It's commonly used for video encoding and transcoding.|
|x265||3.4||x265 is a video encoding library that specializes in encoding videos using the H.265/HEVC codec, offering high compression efficiency for video content.|
|libvpx||v1.9.0||libvpx is an open-source video codec library used for encoding and decoding VP8 and VP9 video formats, commonly used for web-based video streaming.|
|lame||3.100||LAME is an audio encoder that converts audio files to the MP3 format, making it widely used for creating MP3 audio files.|
|ogg||v1.3.4||Ogg is a multimedia container format, and this library provides support for encoding and decoding audio and video in the Ogg format.|
|theora||v1.1.1||Theora is an open video codec designed for efficient video compression within the Ogg multimedia framework.|
|opus||v1.3.1||Opus is a versatile audio codec capable of handling both voice and music with low latency and high-quality compression.|
|vorbis||v1.3.3||Vorbis is an open-source audio codec known for its high audio quality and efficient compression. It's often used for audio streaming.|
|zlib||v1.2.11||zlib is a compression library that provides data compression and decompression functionality, commonly used in file compression formats like gzip.|
|libwebp||v1.1.0||libwebp is a library for working with the WebP image format, offering efficient image compression for web use|
|freetype2||v2.10.4||FreeType 2 is a library for rendering fonts. It is commonly used for text rendering in applications and systems.|
|fribidi||v1.0.9||FriBidi is a library for handling bidirectional text (text containing both left-to-right and right-to-left scripts) and is often used in text layout and rendering.|
|harfbuzz||5.2.0||HarfBuzz is a text shaping engine that allows complex script text to be rendered correctly. It's used in conjunction with font rendering libraries.|
|libass||0.15.0||libass is a library for rendering and formatting subtitles in multimedia applications, making it essential for displaying subtitles alongside video content.|
|zimg||3.0.5||zimg implements the commonly required image processing basics of scaling, colorspace conversion, and depth conversion.|