Я запрограммировал сервер, который создает аудиопоток из аудиовхода моего MacBook, используя express , osx-audio и lame :
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 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 .