Windows 上の ffmpeg によって (DirectShow を使用して) キャプチャされたシステム オーディオを、ストリーミング MP3 ファイルとしてブラウザーに出力する小さな nodeJS サーバーを作成しました。オーディオは、バッファリングを最小限に抑えて、またはバッファリングなしで、可能な限りライブである必要があり、オーディオの「スキップ」効果は完全に許容されます。
HTML5 オーディオ タグを使用して Chrome でオーディオを再生すると、低遅延の LAN 接続で約 8 ~ 10 秒の遅延が発生します。これはクライアント側のバッファではないかと考え、クライアント側で Flash MP3 プレーヤーを使用したところ、遅延が 2 ~ 3 秒に短縮されました。
現在、バッファリングはサーバー側で行われているようです。NodeJS の response.write のドキュメントには、データがカーネル バッファーに書き込まれることが記載されています。クライアントが常に最新の音声データを取得できるように、バッファリングを完全に回避するか、少なくともバッファリングを回避するにはどうすればよいですか? 「ドレイン」イベントを処理して常にライブデータをプッシュするための戦略は?
request オブジェクトでは、setNoDelay(true)を使用して Nagle のアルゴリズムの使用を回避しました。以下は、生成された ffmpeg プロセスがデータを発行するときにデータがどのように書き込まれるかのスニペットです。
var clients = []; //List of client connections currently being served
ffmpeg.stdout.on('data', function(data) {
for(var i = 0; i < clients.length; i++){
clients[i].res.write(data);
}
});