5

少し 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) をチェックしましたが、何の効果もありませんでした。

'ffmpeg 'もう 1 つの非常に奇妙な動作は、(単に ではなく)スペースを含む spawn を呼び出さなければならないという事実です'ffmpeg'。このスペースを省略すると、別のエラーが発生します ( stderr: "/path/to/my/movie.mpeg": no such file or directory)。シェルから直接 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(' ', '\ ')もので十分でした。

4

1 に答える 1