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

使用fluent-ffmpeg提示文件不存在但路径正确问题求助

解决fluent-ffmpeg提示「No such file or directory」的问题

以下是针对该问题的排查和解决方法:

  • 使用绝对路径替代相对路径
    相对路径是基于Node进程的启动目录,而非脚本所在目录,极易引发路径错误。可借助Node的path模块生成可靠的绝对路径:

    const path = require('path');
    
    // 替换原代码中的文件路径
    ffmpeg(path.resolve(__dirname, './viral.mp4'))
      .input(path.resolve(__dirname, './rand_gta.mp4'))
      // ... 其他代码
      .output(path.resolve(__dirname, './out.mp4'))
    

    __dirname指向当前脚本所在目录,path.resolve会生成与运行位置无关的绝对路径,彻底规避相对路径的不确定性。

  • 检查文件权限
    确认Node进程的运行用户对viral.mp4、rand_gta.mp4有读取权限,对输出目录有写入权限:

    • Linux/macOS:执行ls -l ./viral.mp4查看权限,必要时用chmod 644 ./viral.mp4调整读取权限。
    • Windows:右键文件→属性→安全选项卡,确认当前用户拥有读取权限。
  • 验证ffmpeg/ffprobe路径有效性
    打印并检查@ffmpeg-installer提供的路径是否指向真实存在的可执行文件:

    console.log('ffmpeg路径:', ffmpegPath);
    console.log('ffprobe路径:', ffprobePath);
    

    若路径错误,可重新安装依赖修复:

    npm uninstall @ffmpeg-installer/ffmpeg @ffprobe-installer/ffprobe
    npm install @ffmpeg-installer/ffmpeg @ffprobe-installer/ffprobe
    
  • 核对文件名大小写
    Linux/macOS系统中文件名区分大小写,若实际文件名是Viral.mp4而代码中写的是viral.mp4,会直接导致文件找不到。确保代码中的文件名与实际文件名完全一致。

  • 修复异步处理逻辑
    fluent-ffmpeg的run()方法不返回Promise,原代码中的await不会生效,可能引发流程异常。可将逻辑包装为Promise:

    module.exports.merge = () => {
      return new Promise((resolve, reject) => {
        ffmpeg(path.resolve(__dirname, './viral.mp4'))
          .input(path.resolve(__dirname, './rand_gta.mp4'))
          .complexFilter([
            `[0:v]scale=576:1024[0scaled]`,
            `[1:v]scale=576:512[1scaled]`,
            `[0scaled]pad=576:1024[0padded]`,
            `[0padded][1scaled]overlay=0:550[output]`,
          ])
          .outputOptions(['-map 0:a', '-map [output]'])
          .output(path.resolve(__dirname, './out.mp4'))
          .on('error', function (er) {
            console.log('error occured: ' + er.message)
            reject(er);
          })
          .on('progress', ({ percent }) => {
            const value = percent.toFixed(2)
            console.log(`Processing video: ${value}%`)
          })
          .on('end', () => {
            resolve();
          })
          .run()
      })
    }
    

    调整后调用merge()时,就能用await正确等待处理完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:35:30