我正在尝试启动并运行一些 ffmpeg 转换器服务,到目前为止取得了不错的进展。但是,当涉及到生成实际的 ffmpeg 转换过程时,我遇到了障碍。
// options.ffmpegopts is an array containing format-specific parameters
var args = [ '-y', '"' + options.targetfile + '"' ];
args = options.ffmpegopts.concat(args);
var ffmpegProc = spawn('ffmpeg ', args);
ffmpegProc.stderr.on('data', function(data) {
console.log('stderr: ' + data);
});
执行此代码时,我得到以下控制台输出:
stderr: execvp(): No such file or directory
我已经检查了不同的节点版本(0.4.0、0.4.2 和 0.5.0-pre),但没有任何效果。
另一个非常奇怪的行为是我必须调用 spawn 包括一个空格('ffmpeg '
而不仅仅是'ffmpeg'
)。如果我省略这个空格,我会得到一个不同的错误(stderr: "/path/to/my/movie.mpeg": no such file or directory
)。当直接从 shell 调用 ffmpeg 时,发送到 child_process.spawn() 的命令执行没有任何问题。
关于那个有任何提示吗?我已经检查了其他实现相同的项目(如node-imagemagick或ffmpeg-node,但启蒙并没有击中我......
更新: strace() 输出
使用 运行我的应用程序时strace -fF -o strace.log node server.js
,我可以 grep 以下进程生成调用:
execve("/usr/local/sbin/ffmpeg", ["ffmpeg", "-i", "\"/data/media_dev/test/ORG_mymovi"..., "-sameq", "-ab", "128k", "-ar", "44100", "-b", "512k", "-r", "25", "-s", "320x240", "-f", "flv", ...], [/* 20 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/local/bin/ffmpeg", ["ffmpeg", "-i", "\"/data/media_dev/test/ORG_mymovi"..., "-sameq", "-ab", "128k", "-ar", "44100", "-b", "512k", "-r", "25", "-s", "320x240", "-f", "flv", ...], [/* 20 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/sbin/ffmpeg", ["ffmpeg", "-i", "\"/data/media_dev/test/ORG_mymovi"..., "-sameq", "-ab", "128k", "-ar", "44100", "-b", "512k", "-r", "25", "-s", "320x240", "-f", "flv", ...], [/* 20 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/bin/ffmpeg", ["ffmpeg", "-i", "\"/data/media_dev/test/ORG_mymovi"..., "-sameq", "-ab", "128k", "-ar", "44100", "-b", "512k", "-r", "25", "-s", "320x240", "-f", "flv", ...], [/* 20 vars */]) = 0
在看到路径上奇怪地转义的双引号后,我尝试在没有引号的情况下调用 ffmpeg ......就像一个魅力。但问题仍然存在,我需要能够在路径中使用空格。
有什么建议么?
更新:解决方案
让它与空间一起工作,一个简单inputfile.replace(' ', '\ ')
的就足够了。