ffmpeg.js
本库提供了使用 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。
-
克隆 ffmpeg.js 仓库及其子模块:
git clone https://github.com/Kagami/ffmpeg.js.git --recurse-submodules -
如需进行自定义构建,请修改 Makefile 和/或补丁。
-
构建所有内容:
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 编码器。请确保在您的国家/地区使用之前咨询律师。
包含的库:
- x264 采用 GPL 许可。
- LAME 采用 LGPL 许可。
请参阅 LICENSE.MP4 以获取此构建中使用的软件许可证全文。
