簡體   English   中英

在node.js中生成子進程時出錯

[英]Error when spawning child process in 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);
});

執行此代碼時,我得到以下控制台輸出:

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-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM