使用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:右键文件→属性→安全选项卡,确认当前用户拥有读取权限。
- Linux/macOS:执行
验证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
相关产品推荐
相关产品推荐

