FFmpeg 类
FFmpeg 类是与 ffmpeg.wasm 库交互的主要接口。它提供了一个基于 Promise 的简洁 API,用于在浏览器环境中访问 FFmpeg 功能,并通过 Web Worker 系统处理与 WebAssembly FFmpeg 核心通信的所有复杂性。
概述
FFmpeg 类作为一个抽象层,使 JavaScript 应用程序能够在浏览器中利用 FFmpeg 的多媒体处理能力。该类是 @ffmpeg/ffmpeg 包的一部分,位于核心 WebAssembly 模块之上。
类架构
FFmpeg 类使用消息传递架构与运行在独立 Web Worker 线程中的 FFmpeg 核心进行通信。这种设计可防止在进行密集型视频处理操作时阻塞主 UI 线程。
内部结构
FFmpeg 类维护几个私有属性来管理其状态并与 Web Worker 通信:
#worker:Web Worker 实例的引用#resolves和#rejects:待处理 Promise 解析的回调映射#logEventCallbacks和#progressEventCallbacks:用于事件处理的回调函数数组loaded:公共布尔标志,指示是否已成功加载 FFmpeg 核心
FFMessageType 协议
FFmpeg 类与 worker.ts 之间的通信由 FFMessageType 枚举控制。该协议确保双方都能理解消息的意图(例如 LOAD、EXEC、WRITE_FILE)。
初始化和加载
构造函数
FFmpeg 类构造函数初始化内部状态。注意 ffmpeg.wasm 不支持 Node.js;对于 Node 环境提供了一个空实现,在实例化时会抛出错误。
加载 FFmpeg 核心
load() 方法在 Web Worker 内初始化 WebAssembly FFmpeg 核心。必须在调用任何其他方法之前调用此方法。
await ffmpeg.load({
coreURL: 'https://cdn.jsdelivr.net/npm/@ffmpeg/core@0.12.0/dist/umd/ffmpeg-core.js'
});load() 方法接受 FFMessageLoadConfig:
| 参数 | 类型 | 描述 |
|---|---|---|
coreURL | string | ffmpeg-core.js 文件的 URL。 |
wasmURL | string | ffmpeg-core.wasm 文件的 URL。 |
workerURL | string | ffmpeg-core.worker.js 文件的 URL(用于多线程)。 |
classWorkerURL | string | @ffmpeg/ffmpeg 提供的 worker.js 文件的 URL。 |
核心功能
执行命令 (exec 和 ffprobe)
exec() 方法使用指定的参数运行 ffmpeg 二进制文件。为了避免常见的 I/O 问题,默认情况下会在核心中将 ["-nostdin", "-y"] 预添加到参数中。
ffprobe() 方法用于分析媒体文件。
| 参数 | 类型 | 描述 |
|---|---|---|
args | string[] | 命令行参数。 |
timeout | number | 停止执行前的毫秒数(默认为 -1)。 |
signal | AbortSignal | 允许通过 AbortController 取消操作。 |
虚拟文件系统 (VFS) 方法
FFmpeg 类通过消息传递向 worker.ts 暴露 Emscripten FS API。
| 方法 | Emscripten 映射 | 用途 |
|---|---|---|
writeFile(path, data) | FS.writeFile | 将数据写入 VFS |
readFile(path, encoding) | FS.readFile | 从 VFS 读取数据 |
deleteFile(path) | FS.unlink | 删除文件 |
rename(old, new) | FS.rename | 重命名节点 |
createDir(path) | FS.mkdir | 创建目录 |
listDir(path) | FS.readdir + FS.stat | 列出目录内容 |
deleteDir(path) | FS.rmdir | 删除空目录 |
文件系统挂载
mount() 方法允许附加外部存储后端,如 WORKERFS(用于高效访问大型 File 或 Blob 对象而无需复制)。
await ffmpeg.mount(FFFSType.WORKERFS, {
files: [fileObject]
}, '/mnt');事件处理
该 FFmpeg 类通过 on() 和 off() 方法扩展了观察者模式,用于从 worker 流式传输日志和进度信息
log: 捕获来自 FFmpeg 的stdout和stderrprogress: 提供小数形式的progress(0 到 1)以及当前time(以微秒为单位)
内部 Promise 跟踪
该类使用内部的 #resolves 和 #rejects 对象来管理异步操作
- 分发:
#send()通过getMessageID()生成唯一 ID,将 Promise 的resolve/reject存储在映射表中,并调用postMessage() - 处理:
#registerHandlers()监听onmessage。当响应到达时,它匹配id,从映射表中检索回调函数,并解决原始的 Promise
终止
terminate() 方法会立即终止 Web Worker,并使用 ERROR_TERMINATED 拒绝所有待处理的 Promise