sch*_*rmu 5 spawn execvp node.js
我正试图让一个小的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);
});
Run Code Online (Sandbox Code Playgroud)
执行此代码时,我得到以下控制台输出:
stderr: execvp(): No such file or directory
Run Code Online (Sandbox Code Playgroud)
我已经检查了不同的节点版本(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 -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
Run Code Online (Sandbox Code Playgroud)
在路径上看到奇怪的双重引号之后,我试图在没有引号的情况下调用ffmpeg ......就像一个魅力.但问题仍然存在,我需要能够在我的路径中使用空格.
有什么建议?
得到它与空间合作,一个简单inputfile.replace(' ', '\ ')
就足够了.
我敢打赌,末尾的空格"ffmpeg "
是当前问题的原因。一个快速的小 C 程序将表明:
#include <unistd.h>
int main(int argc, char *argv[]) {
execvp(argv[1], &argv[1]);
perror(argv[0]);
}
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
$ ./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
$
Run Code Online (Sandbox Code Playgroud)
我建议再次删除空格,然后在strace(1) -fF
. 查找实际执行的命令,看看错误信息/path/to/my/movie.mpeg
是来自ffmpeg
还是来自node.js
.
归档时间: |
|
查看次数: |
9307 次 |
最近记录: |