含{}的文件名触发FFmpeg退出码4294967294问题求助
解决FFmpeg处理含
{}字符文件名时的“文件不存在”错误 问题根源
FFmpeg命令行解析逻辑中,{}属于滤镜语法的特殊占位符,直接通过系统shell执行命令时,即使给路径加引号,不同操作系统的shell(Windows cmd/PowerShell、Linux bash等)对特殊字符的解析规则差异,会导致路径被错误解析,最终触发“文件不存在”的错误。此外,手动过度转义操作反而可能破坏原始路径的合法性。
解决方案
1. 用child_process.spawn替代exec
Node.js的exec方法会通过系统shell解析整个命令字符串,极易引发特殊字符解析问题;而spawn方法直接传递参数数组,每个参数独立解析,能彻底避免shell转义带来的干扰。
示例代码:
const { spawn } = require('child_process'); const fs = require('fs'); const inputPath = 'Test Video 3 {Test Cut} [2020].mp4'; const outputPath = 'Test Video 3 {Test Cut} [2020]_output.mp4'; // 先验证文件实际存在 if (!fs.existsSync(inputPath)) { console.error(`错误:文件 ${inputPath} 不存在`); process.exit(1); } // 以参数数组形式调用FFmpeg const ffmpegProcess = spawn('ffmpeg', [ '-i', inputPath, '-metadata', 'title=Test Video 3', '-metadata', 'subtitle=Test Cut', '-metadata', 'year=2020', '-c', 'copy', outputPath ]); // 捕获日志用于排查问题 ffmpegProcess.stdout.on('data', (data) => { console.log(`FFmpeg标准输出: ${data}`); }); ffmpegProcess.stderr.on('data', (data) => { console.error(`FFmpeg错误输出: ${data}`); }); ffmpegProcess.on('close', (code) => { console.log(`FFmpeg退出码: ${code}`); });
2. 移除多余的路径转义操作
你的sanitizeFilePath函数中对{}或非字母数字字符的转义操作完全没必要,spawn会自动处理参数中的特殊字符,直接使用原始文件名作为参数即可。
3. 排查基础环境问题
如果上述方法仍无效,确认:
- FFmpeg已正确安装并加入系统PATH,或在代码中指定FFmpeg的完整路径(如
C:/ffmpeg/bin/ffmpeg.exe或/usr/bin/ffmpeg) - 当前Node.js进程拥有读取输入文件、写入输出文件的权限
内容的提问来源于stack exchange,提问作者Holly Wilson
相关产品推荐
相关产品推荐

