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

使用ffmpeg.wasm在Next.js中从Canvas录视频时遇FS错误

解决Next.js中ffmpeg.wasm执行exec时的FS错误问题
  • 强制组件在客户端运行
    Next.js 13的App Router默认是服务器组件,ffmpeg.wasm依赖浏览器环境的WebAssembly和文件系统API,必须在客户端组件中执行。在组件文件顶部添加'use client'指令,确保代码只在浏览器端运行。

  • 严格控制文件操作顺序
    确保写入输入文件、执行转码、读取输出文件这三步是严格的异步顺序,不能并行操作。比如:

    // 先完成输入文件写入
    await ffmpegRef.current.writeFile('recorded.webm', recordedBlob);
    // 等待转码命令执行完毕
    await ffmpegRef.current.exec('-y', '-i', 'recorded.webm', '-an', '-c:v', 'copy', 'output_copy.webm');
    // 最后读取输出文件
    const outputBuffer = await ffmpegRef.current.readFile('output_copy.webm');
    

    若写入操作未完成就执行exec,会导致ffmpeg读取到不完整的文件,触发FS错误。

  • 替换直接copy编码流的方式
    Canvas录制的WebM多采用VP9编码,而ffmpeg.wasm默认构建可能缺少完整的VP9编码支持,导致-c:v copy失败。尝试重新编码而非直接复制流:

    // 使用VP9重新编码
    await ffmpegRef.current.exec('-y', '-i', 'recorded.webm', '-an', '-c:v', 'libvpx-vp9', '-crf', '30', 'output.webm');
    

    如果需要H.264格式,需引入支持H.264的ffmpeg.wasm完整版本(可通过安装@ffmpeg/ffmpeg的full包获取)。

  • 调整内存分配
    浏览器中ffmpeg.wasm的默认内存限制可能不足以处理视频,初始化时指定更大内存:

    import { createFFmpeg } from '@ffmpeg/ffmpeg';
    
    const ffmpeg = createFFmpeg({
      log: true,
      corePath: '/ffmpeg-core.js', // 核心文件需放在Next.js的public目录下
      mem: 8 * 1024 * 1024 * 1024 // 分配8GB内存,按需调整
    });
    
  • 确认核心文件路径正确性
    ffmpeg的核心文件(ffmpeg-core.js、ffmpeg-core.wasm、ffmpeg-core.worker.js)必须放在Next.js的public目录下,初始化时的corePath要指向正确的相对路径,否则核心加载失败会间接引发FS错误。

内容的提问来源于stack exchange,提问作者NineCattoRules

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:42:37