gpt4 book ai didi

node.js - 在 node.js 中生成子进程时出错

转载 作者:搜寻专家 更新时间:2023-10-31 22:46:34 26 4
gpt4 key购买 nike

我正在尝试启动并运行一些 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

我已经检查了不同的 Node 版本(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-imagemagickffmpeg-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(' ', '\') 就足够了。

最佳答案

我敢打赌,"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
$

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

关于node.js - 在 node.js 中生成子进程时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5229572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com