项目路线图
本页面概述了 ffmpeg.wasm 的当前状态、已知限制以及未来的开发计划。其中包括从旧版本迁移的技术细节,以及 WebAssembly 环境施加的具体约束。
当前项目状态
ffmpeg.wasm 在 0.12.0 版本进行了重写,以采用基于 TypeScript 的单仓库(monorepo)结构。该项目现在支持官方的 Web Worker 执行,并为单线程(@ffmpeg/core)和多线程(@ffmpeg/core-mt)执行提供了独立的包。
版本迁移(0.11.x 到 0.12+)
0.12+ 版本引入了破坏性 API 更改,以提高一致性并支持 async/await 等现代 JavaScript 模式。
| 0.11.x 功能 | 0.12+ 对应项 | 备注 |
|---|---|---|
import { createFFmpeg } from '@ffmpeg/ffmpeg' | import { FFmpeg } from '@ffmpeg/ffmpeg' | 基于类的实例化 |
createFFmpeg() | new FFmpeg() | 配置移至 ffmpeg.load() |
await ffmpeg.run(...args) | await ffmpeg.exec([...args]) | 重命名以提高清晰度 |
ffmpeg.FS.writeFile() | await ffmpeg.writeFile() | 移至顶层异步 |
ffmpeg.exit() | ffmpeg.terminate() | 更好地反映 worker 生命周期 |
ffmpeg.setLogger() | ffmpeg.on("log", callback) | 事件驱动架构 |
import { fetchFile } from '@ffmpeg/ffmpeg' | import { fetchFile } from '@ffmpeg/util' | 移至工具包 |
已知限制
WebAssembly 环境施加了几个硬性约束,定义了项目的技术边界。
1. 性能和内存
- WASM 与原生: WebAssembly 的执行速度显著慢于原生执行。多线程(
mt)版本的速度可提升约 2 倍,但会消耗更多的 CPU 和内存 - 2 GB 文件限制: 由于 WebAssembly 当前的内存寻址约束,输入文件存在 2 GB 的硬性限制
2. 网络和 Node.js
- RTSP 支持: 目前不支持,因为 WebAssembly 缺乏原始套接字功能
- Node.js 支持终止: 为了专注于浏览器特定的优化并减少维护开销,0.12.0 版本起官方不再支持 Node.js
3. 安全要求
多线程需要 SharedArrayBuffer,这 necessitates 特定的 HTTP 头以实现跨源隔离:
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp
未来路线图
项目的演进侧重于利用新的 WebAssembly 特性并优化构建流水线。
短期目标
- WebAssembly 内建函数: 研究使用 SIMD 和内联汇编代码来缩小与原生 FFmpeg 的性能差距
- 库扩展: 在 Docker 构建过程中添加对更多流行外部库的支持
- 构建优化: 进一步优化基于 Docker 的多阶段构建,以减少特定用例的二进制文件大小
代码实体映射:Build 到 Core
社区与贡献
该项目正在积极寻求维护者,协助完成转译 FFmpeg 庞大功能集这一复杂任务。
贡献工作流程
- 环境设置: 多阶段构建流水线需要 Docker 23.0+
- 核心开发: 大部分社区工作集中在
@ffmpeg/core上,用于添加新编解码器或优化标志 - 依赖更新: 通过
build/*.sh脚本管理,这些脚本为 Emscripten 配置zimg、x264和libvpx等库