web-dev-qa-db-ja.com

低遅延でライブオーディオをストリーミングする方法

expressosx-audio および lame を使用して、MacBookのオーディオ入力からオーディオストリームを作成するサーバーをプログラミングしました。

const http = require("http");
const express = require("express");
const audio = require("osx-audio");
const lame = require("lame");
const audioInput = new audio.Input();

const encoder = new lame.Encoder({
  channels: 2,
  bitDepth: 16,
  sampleRate: 44100,
  bitRate: 128,
  outSampleRate: 22050,
  mode: lame.STEREO
});

audioInput.pipe(encoder);

const app = express();
const server = http.Server(app);

app.get("/stream.mp3", (req, res) => {
  res.set({
    "Content-Type": "audio/mpeg",
    "Transfer-Encoding": "chunked"
  });
  encoder.pipe(res);
});

server.listen(3000);

クライアント側では、このオーディオストリームからのサウンドは <audio> 要素として次のように含まれています。

<audio controls autoplay preload="none">
  <source src="./stream.mp3" type="audio/mpeg" />
  <p>Oops – your browser doesn't support HTML5 audio!</p>
</audio>

これは機能します。オーディオ要素の[再生]ボタンをクリックすると、サーバーに接続されているブラウザーから、ラップトップで選択した入力ソースからの音を聞くことができます。

ただし、ブラウザによって再生されるオーディオは、元の信号より数秒遅れます。私はpreload="none"を使用しているようですが、ブラウザは再生を開始する前にオーディオストリームのかなりの部分をバッファします。

ここに欠けている明らかなものはありますか?数秒ではなく数ミリ秒のレイテンシでリアルタイムオーディオを実現するより良い方法はありますか?

興味があれば、私のプロジェクトの完全なソースコードは ここではGitHub です。

9
Patrick Hund

ホイールを再発明するのではなく、 [〜#〜] ffmpeg [〜#〜] を使用して、「完全なクロスプラットフォームソリューションをオーディオとビデオを記録、変換、ストリーミングします。」

例:

ffmpeg -re -i input -f rtsp -muxdelay 0.1 rtsp://server/live.sdp

ブラウザで問題のないライブラリ(h.264、mpegなど)を選択できます。

4