You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

浏览器端@ffmpeg/ffmpeg处理大视频报OOM错误求助

解决@ffmpeg/ffmpeg浏览器端处理大视频OOM问题

核心原因

RuntimeError: abort(OOM) 报错是因为WebAssembly实例的默认内存配额不足以处理10MB视频的解码/编码操作——视频处理过程中需要临时内存存储帧数据、编码缓存等,文件体积越大,所需的临时内存越高。

解决方案

1. 提升FFmpeg实例的内存配额

创建FFmpeg实例时,通过mem参数指定更大的内存限制(单位为MB),根据浏览器可用内存调整,例如设置为2048MB(2GB):

const ffmpeg = createFFmpeg({
  corePath: "https://unpkg.com/@ffmpeg/core@0.11.0/dist/ffmpeg-core.js",
  log: true,
  mem: 2048 // 增加内存配额,按需调整数值
});

2. 添加高效编码参数减少内存占用

直接转码时FFmpeg默认参数内存消耗较高,添加针对性的压缩参数,既控制输出质量,又降低内存压力:

await ffmpeg.run(
  "-i", "input.mov",
  "-crf", "28", // 压缩质量控制,范围18-28,值越大文件越小、质量越低
  "-preset", "medium", // 平衡编码速度与压缩效率的预设
  "-threads", "2", // 限制线程数,减少并发内存占用
  "output.mp4"
);

3. 及时清理临时资源避免内存泄漏

处理完成后,释放FFmpeg文件系统中的临时文件和Blob URL,防止内存堆积:

const handleUpload = async (e) => {
  const file = e.target.files[0];
  try {
    ffmpeg.FS("writeFile", "input.mov", await fetchFile(file));
    await ffmpeg.run("-i", "input.mov", "-crf", "28", "-preset", "medium", "output.mp4");
    const data = ffmpeg.FS("readFile", "output.mp4");
    const compressedVideo = URL.createObjectURL(
      new Blob([data.buffer], { type: "video/mp4" })
    );
    setCompressedVideo(compressedVideo);
  } finally {
    // 删除FFmpeg文件系统中的临时文件
    ffmpeg.FS("unlink", "input.mov");
    ffmpeg.FS("unlink", "output.mp4");
    // 在组件卸载时记得释放Blob URL:URL.revokeObjectURL(compressedVideo)
  }
};

4. 升级FFmpeg核心版本

你当前使用的core版本为0.11.0,较旧版本可能存在内存管理缺陷,升级到稳定的新版本(如0.20.x)可优化内存使用:

const ffmpeg = createFFmpeg({
  corePath: "https://unpkg.com/@ffmpeg/core@0.20.0/dist/ffmpeg-core.js",
  log: true,
  mem: 2048
});

注意事项

  • 浏览器内存受设备总内存和当前标签页可用内存限制,若设备本身内存不足,即使调整参数仍可能报错。
  • 视频编码格式影响内存占用,比如ProRes编码的MOV文件,解码所需内存远高于H.264编码的MOV。

内容的提问来源于stack exchange,提问作者Martí Serra Molina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:20:24