次のコードは、child_process.fork() メソッドを使用してモジュールとしてメインの app.js によって読み込まれます。
var spawn = require('child_process').spawn;
var ffmpeg = spawn('C:\\Program Files (x86)\\ffmpeg\\bin\\ffmpeg.exe', ['-y', '-threads', '-0', '-re', '-rtbufsize', '204800000', '-probesize', '4096', '-vsync', '2', '-async', '30', '-f', 'dshow', '-s', '320x240', '-i', 'video=Integrated Webcam:audio=Microphone Array (IDT High Defi', '-c:a', 'libvo_aacenc', '-ab', '48000', '-ar', '22050', '-ac', '2', '-c:v', 'libx264', '-s', '400x300', '-g', '96', '-x264opts', 'bitrate=1200', '-preset', 'ultrafast', '-profile:v', 'baseline', '-pix_fmt', 'yuv420p', '-aspect', '4:3', '-f', 'flv', 'rtmp://server']);
setTimeout(function() {
ffmpeg.stderr.on('data', function() {
ffmpeg.stdin.setEncoding('utf8');
ffmpeg.stdin.write('q');
process.exit();
});
}, 10000);
私が作っていたよりもはるかに複雑ではありませんでした。メインの app.js は、提供される基本的な HTML ページであり、socket.io を使用してイベントとそれに対応するデータを受け取ります。この場合、「true」イベントは、FFMPEG のライブ キャプチャ セッションを起動する module.js ファイルをロードし、それを RTMP サーバーにフィードし、10 秒のタイムアウトで FFMPEG を正常にシャットダウンします。
私の次のタスクは、タイムアウトの現在のテスト方法とは対照的に、Web インターフェイスからトリガーされたイベントを介してシャットダウンすることです。
Windows のタスク マネージャーを見ると、セカンダリ ノード プロセスと同様に FFMPEG プロセスが閉じます。
この理由は、私が見つけた node-ffmpeg モジュールのどれも、キャプチャ入力を介したライブ ストリーミングをサポートしていなかったためです。主に既存のコンテンツのトランスコードを目的としているようです。この最終的な成果は、理想的には、FFMPEG を開始および停止できる Web ベースのインターフェイスになります。私たちのユース ケースでは、標準の mp4 ファイルを保存できないため、Adobe Media Server のソースとして Adobe Flash Media Live Encoder を置き換えます。