在node.js中产生subprocess时出错

我试图得到一个小小的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节点 ,但启发没有打我…

更新: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 

看到奇怪的path上双引号后,我试图打电话ffmpeg没有引号…工作就像一个魅力。 但问题仍然存在,我需要能够在我的path空间工作。

有什么build议么?

更新:解决scheme

得到它与空间的工作,一个简单的inputfile.replace(' ', '\ ')就够了。

我敢打赌, "ffmpeg "结尾的空间是当前问题的原因。 一个快速的小C程序将显示:

  #include <unistd.h> int main(int argc, char *argv[]) { execvp(argv[1], &argv[1]); perror(argv[0]); } 

给出以下输出:

 $ ./execvp "ffmpeg" FFmpeg version 0.6-4:0.6-2ubuntu6, Copyright (c) 2000-2010 the FFmpeg developers ... $ ./execvp "ffmpeg " ./execvp: No such file or directory $ 

我build议再次删除空间,并在strace(1) -fF下重新运行。 查找实际执行的命令,并查看有关/path/to/my/movie.mpeg的错误消息是来自ffmpeg还是来自node.js