ITADN
Kagami/ffmpeg.js
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

ffmpeg.js

NPM

本库提供了使用 Emscripten 项目 移植到 JavaScript 的 FFmpeg 构建。这些构建针对浏览器内使用进行了优化:最小化体积以加快加载速度、asm.js、性能调优等。它们同样适用于 Node。

构建

当前可用的构建(未来可能会添加更多构建):

  • ffmpeg-webm.js - WebM 编码(VP8 和 Opus 编码器,常用解码器)。
  • ffmpeg-worker-webm.js - ffmpeg-webm.js 的 Web Worker 版本。
  • ffmpeg-mp4.js - MP4 编码(H.264 和 AAC 和 MP3 编码器,常用解码器)。
  • ffmpeg-worker-mp4.js - ffmpeg-mp4.js 的 Web Worker 版本。

注意:只有 NPM 发布版本包含上述文件。

版本方案

ffmpeg.js 使用以下版本模式:major.minor.9ddd,其中:

  • major - 构建中使用的 FFmpeg 主版本号。
  • minor - FFmpeg 次版本号。
  • ddd - ffmpeg.js 自身的补丁版本。不应与 FFmpeg 的补丁版本号混淆。

示例:2.7.9005

用法

请参阅 Module 对象 文档,了解可传递的选项列表。

同步运行

ffmpeg.js 提供通用模块 API,ffmpeg-webm.js 是默认模块。如果需要其他构建,请在斜杠后添加其名称,例如 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);
  },
});

例如,在浏览器环境中使用 browserify

通过 Web Worker

ffmpeg.js 还为 main 函数提供了带有 Web Worker 接口的封装,以便将工作卸载到不同的进程中。Worker 发送以下消息:

  • {type: "ready"} - Worker 已加载并准备好接受命令。
  • {type: "run"} - Worker 已启动任务。
  • {type: "stdout", data: "<line>"} - FFmpeg 输出到 stdout。
  • {type: "stderr", data: "<line>"} - FFmpeg 输出到 stderr。
  • {type: "exit", data: "<code>"} - FFmpeg 已退出。
  • {type: "done", data: "<result>"} - 任务已完成并返回某些结果。
  • {type: "error", data: "<error description>"} - 发生错误。
  • {type: "abort", data: "<abort reason>"} - FFmpeg 异常终止(例如内存不足、wasm 错误)。

您可以向 worker 发送以下消息:

  • {type: "run", ...opts} - 使用提供的选项启动新任务。
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;
  }
};

在 Node 环境下,你可以使用 worker_threads 模块。

文件

Emscripten 支持多种类型的 文件系统。ffmpeg.js 使用 MEMFS 在 FFmpeg 的工作目录中存储输入/输出文件。你需要向 MEMFS 选项传递一个 Array 类型的 Object 数组,其中包含以下键:

  • name (String) - 文件名,不能包含斜杠。
  • data (ArrayBuffer/ArrayBufferView/Array) - 文件数据。

ffmpeg.js 返回的对象包含一个 MEMFS 选项,其结构相同,并包含未作为输入传递的文件,即由 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));

你还可以通过向 mounts 选项传递 Array 类型的 Object 来挂载其他文件系统,其中包含以下键:

  • type (String) - 文件系统名称。
  • opts (Object) - 底层文件系统选项。
  • mountpoint (String) - 挂载路径,必须以斜杠开头,不得包含其他斜杠,并且以下路径已被列入黑名单:/tmp, /home, /dev, /work。挂载目录将在挂载前自动创建。

有关更多详细信息,请参阅 FS.mount 的文档。

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.

构建说明

建议使用 Docker 来构建 ffmpeg.js。

  1. 克隆 ffmpeg.js 仓库及其子模块:

    git clone https://github.com/Kagami/ffmpeg.js.git --recurse-submodules
  2. 如需进行自定义构建,请修改 Makefile 和/或补丁。

  3. 构建所有内容:

    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

就是这样。ffmpeg.js 模块应出现在你的仓库克隆中。

不使用 Docker 构建

Ubuntu 示例:

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

致谢

感谢 videoconverter.js 提供的灵感。当然,也要感谢所有让本库成为可能的项目:FFmpeg、Emscripten、asm.js、node.js 以及许多其他项目。

许可证

本库代码采用 LGPL 2.1 或更高版本许可。

WebM 构建

此构建使用了 LGPL 版本的 FFmpeg,因此采用 LGPL 2.1 或更高版本许可。请参阅 此处 以获取更多详细信息及 FFmpeg 的许可证信息。

包含的库:

请参阅 LICENSE.WEBM 以获取此构建中使用的软件许可证全文。

MP4 构建

此构建使用了 GPL 版本的 FFmpeg,因此采用 GPL 2.0 许可。它还包含受专利限制的 H.264、AAC 和 MP3 编码器。请确保在您的国家/地区使用之前咨询律师。

包含的库:

请参阅 LICENSE.MP4 以获取此构建中使用的软件许可证全文。