我编写了一个服务器,使用express、osx-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上。