少し 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-imagemagickやffmpeg-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(' ', '\ ')
もので十分でした。