Kagami/ffmpeg.js

★ 3,461⑂ 0

Port of FFmpeg with Emscripten

About Kagami/ffmpeg.js

Kagami/ffmpeg.js is an open-source project on GitHub, mainly written in JavaScript. Port of FFmpeg with Emscripten It currently holds 3,461 stars and 0 forks with 0 open issues, and was last pushed on an unknown date (repository created unknown).

Project Overview

Git Homed tracks it on the Video Trending board and on the AI Video Trending list.

GitHub Repository Details

Repository Kagami/ffmpeg.js · default branch - · size 0 KB · watchers 0 · source: GitHub REST API and repository README

README

ffmpeg.js

NPM

This library provides FFmpeg builds ported to JavaScript using Emscripten project. Builds are optimized for in-browser use: minimal size for faster loading, asm.js, performance tunings, etc. Though they work in Node as well.

Builds

Currently available builds (additional builds may be added in future):

Note: only NPM releases contain abovementioned files.

Version scheme

ffmpeg.js uses the following version pattern: major.minor.9ddd, where:

Example: 2.7.9005

Usage

See documentation on Module object for the list of options that you can pass.

Sync run

ffmpeg.js provides common module API, ffmpeg-webm.js is the default module. Add its name after the slash if you need another build, e.g. require("ffmpeg.js/ffmpeg-mp4.js").

const ffmpeg = require("ffmpeg.js");
let stdout = "";
let stderr = "";
// Print FFmpeg's version.
ffmpeg({
  arguments: ["-version"],
  print: function(data) { stdout += data + "\n"; },
  printErr: function(data) { stderr += data + "\n"; },
  onExit: function(code) {
    console.log("Process exited with code " + code);
    console.log(stdout);
    console.log(stderr);
  },
});

Use e.g. browserify in case of Browser.

Via Web Worker

ffmpeg.js also provides wrapper for main function with Web Worker interface to offload the work to a different process. Worker sends the following messages:

You can send the following messages to the worker:
  • {type: "run", ...opts} - Start new job with provided options.
const worker = new Worker("ffmpeg-worker-webm.js");
worker.onmessage = function(e) {
  const msg = e.data;
  switch (msg.type) {
  case "ready":
    worker.postMessage({type: "run", arguments: ["-version"]});
    break;
  case "stdout":
    console.log(msg.data);
    break;
  case "stderr":
    console.log(msg.data);
    break;
  case "done":
    console.log(msg.data);
    break;
  }
};

You can use worker_threads module in case of Node.

Files

Empscripten supports several types of file systems. ffmpeg.js uses MEMFS to store the input/output files in FFmpeg's working directory. You need to pass Array of Object to MEMFS option with the following keys:

  • name (String) - File name, can't contain slashes.
  • data (ArrayBuffer/ArrayBufferView/Array) - File data.
ffmpeg.js resulting object has MEMFS option with the same structure and contains files which weren't passed to the input, i.e. new files created by FFmpeg.

const ffmpeg = require("ffmpeg.js");
const fs = require("fs");
const testData = new Uint8Array(fs.readFileSync("test.webm"));
// Encode test video to VP8.
const result = ffmpeg({
  MEMFS: [{name: "test.webm", data: testData}],
  arguments: ["-i", "test.webm", "-c:v", "libvpx", "-an", "out.webm"],
});
// Write out.webm to disk.
const out = result.MEMFS[0];
fs.writeFileSync(out.name, Buffer(out.data));

You can also mount other FS by passing Array of Object to mounts option with the following keys:

  • type (String) - Name of the file system.
  • opts (Object) - Underlying file system options.
  • mountpoint (String) - Mount path, must start with a slash, must not contain other slashes and also the following paths are blacklisted: /tmp, /home, /dev, /work. Mount directory will be created automatically before mount.
See documentation of FS.mount for more details.

const ffmpeg = require("ffmpeg.js");
ffmpeg({
  // Mount /data inside application to the current directory.
  mounts: [{type: "NODEFS", opts: {root: "."}, mountpoint: "/data"}],
  arguments: ["-i", "/data/test.webm", "-c:v", "libvpx", "-an", "-y", "/data/out.webm"],
});
// out.webm was written to the current directory.

Build instructions

It's recommended to use Docker to build ffmpeg.js.

1. Clone ffmpeg.js repository with submodules:

    git clone https://github.com/Kagami/ffmpeg.js.git --recurse-submodules
    

2. Modify Makefile and/or patches if you wish to make a custom build.

3. Build everything:

    docker run --rm -it -v /path/to/ffmpeg.js:/mnt -w /opt kagamihi/ffmpeg.js
    # cp -a /mnt/{.git,build,Makefile} . && source /root/emsdk/emsdk_env.sh && make && cp ffmpeg*.js /mnt
    

That's it. ffmpeg.js modules should appear in your repository clone.

Build without Docker

Ubuntu example:

sudo apt-get update
sudo apt-get install -y git python build-essential automake libtool pkg-config

cd ~ git clone https://github.com/emscripten-core/emsdk.git && cd emsdk ./emsdk install latest ./emsdk activate latest source emsdk_env.sh

cd ~ git clone https://github.com/Kagami/ffmpeg.js.git --recurse-submodules && cd ffmpeg.js make

Credits

Thanks to videoconverter.js for inspiration. And of course to all great projects which made this library possible: FFmpeg, Emscripten, asm.js, node.js and many others.

License

Own library code licensed under LGPL 2.1 or later.

WebM build

This build uses LGPL version of FFmpeg and thus available under LGPL 2.1 or later. See here for more details and FFmpeg's license information.

Included libraries:

See LICENSE.WEBM for the full text of software licenses used in this build.

MP4 build

This build uses GPL version of FFmpeg and thus available under GPL 2.0. It also includes patent encumbered H.264, AAC and MP3 encoders. Make sure to contact lawyer before using it in your country.

Included libraries:

See LICENSE.MP4 for the full text of software licenses used in this build.

GitHub Stars & Activity

3,461Stars
0Forks
0Open issues
JavaScriptLanguage

GitHub Popularity

GitHub stars3,461
Forks0
Open issues0
Primary languageJavaScript
License-
Stars gained today0
Created-
Last pushed-

Trending History

Trending statusnot on today's boards

Related GitHub Projects

More Trending Repositories