设置开发环境

本文档提供了为 ffmpeg.wasm 设置开发环境的详细指南。内容涵盖构建 WebAssembly 核心的前置条件、管理本地资源以及配置用于跨域隔离的开发服务器。

系统要求

构建 WebAssembly 核心需要一个容器化环境来管理 Emscripten 工具链和库依赖项。

组件要求用途
Docker23.0+用于多阶段构建中使用的 buildx 支持
Make最新版用于执行 Makefile 中定义的构建目标
Node.js18.x+用于包管理和运行开发脚本

本地资源设置

为了避免在每次开发会话期间从 CDN 下载大型二进制文件,该项目提供了一个脚本来从 npm 注册表获取预构建的资源并存储到本地。

download-assets.js

脚本 scripts/download-assets.js 自动化检索 @ffmpeg/ffmpeg、@ffmpeg/util、@ffmpeg/core 和 @ffmpeg/core-mt 的 tarball 包。

  1. 版本跟踪: 该脚本锁定核心和实用程序包的具体版本以确保兼容性
  2. 解压: 它从 https://registry.npmjs.org 下载 .tgz 文件并将它们解压到 public/assets 目录
  3. 本地使用: 下载后,这些资源可以在应用程序的 ffmpeg.load() 配置中使用本地路径引用,而不是远程 URL。

构建 WebAssembly 核心

核心模块 (@ffmpeg/core 和 @ffmpeg/core-mt) 使用 Docker 和 Makefile 进行构建。构建过程支持不同的配置,包括开发(启用分析)和生产(启用优化)。

Makefile 目标

Makefile 定义了多个目标以简化 Docker 构建过程:

目标描述应用的标志
make dev单线程开发构建--profiling, --progress=plain
make dev-mt多线程开发构建--profiling, -sUSE_PTHREADS, -pthread
make prd单线程生产构建-O3, -msimd128
make prd-mt多线程生产构建-O3, -msimd128, -sUSE_PTHREADS, -pthread

自定义构建以减小体积

开发者可以通过修改 Dockerfile 来排除不必要的库从而减小二进制文件大小。如贡献指南所述,这是一个四步过程:

  1. 移除库构建器: 删除 FROM emsdk-base AS <lib>-builder 块
  2. 移除复制指令: 在 ffmpeg-base 阶段删除 COPY --from=<lib>-builder 行
  3. 移除配置标志: 从 ffmpeg-builder 阶段移除 --enable-lib<lib> 标志
  4. 移除链接器标志: 从 ffmpeg-wasm-builder 阶段的 FFMPEG_LIBS 中移除库标志(例如 -lwebp)

开发服务器配置

在使用多线程版本 (@ffmpeg/core-mt) 进行开发时,浏览器需要跨源隔离以启用 SharedArrayBuffer。

COOP/COEP 头信息

开发服务器(无论是使用 Vite、Express 还是其他工具)必须提供以下头信息:

  • Cross-Origin-Opener-Policy: same-origin
  • Cross-Origin-Embedder-Policy: require-corp

Vite 配置示例

在使用 Vite 的项目中(如提供的 Vue 和 React 示例),这些头信息通常配置在 vite.config.ts 中。加载核心时,还必须提供 worker 和 wasm 文件的正确 URL:

设置开发环境

组件关系图

下图将自然语言需求与开发设置中使用的特定代码实体连接起来。

设置开发环境

包开发工作流

JavaScript 包 (@ffmpeg/ffmpeg 和 @ffmpeg/util)

对于开发 JavaScript 包装器,请在各自的目录中使用以下命令:

  • 开发: npm run dev (启动监听器)
  • 构建: npm run build (将 TypeScript 转译为 JS)
  • 检查: npm run lint

核心包 (@ffmpeg/core)

核心包的开发侧重于 C/C++ 依赖项和 Emscripten 胶水代码。

  • 构建: 使用根目录中的 Makefile 目标。
  • 输出: 生成的二进制文件放置在 packages/core/dist 或 packages/core-mt/dist 中