【发布时间】:2019-09-29 11:38:03
【问题描述】:
我编写了一个服务器,使用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",但浏览器在开始播放之前缓冲了相当多的音频流。
这里有什么明显的缺失吗?有没有更好的方法来实现只有几毫秒延迟而不是几秒的实时音频?
如果你有兴趣,我的项目的完整源代码是here on GitHub。
【问题讨论】:
-
我在使用 206 个响应流式传输音频时遇到了类似的问题,然后我找到了一个很好的解决方案,使用 MediaSource 这是为视频创建的 in this example,但可以很容易地转换为纯音频工作。也许这就是某种东西,可以让你走得更远。
-
谢谢,我去看看
-
尝试使用另一个音频编解码器,例如 opus,看看是否是编解码器问题(但我真的不这么认为)。如果它不适合您的目的,您最好在客户端使用 WebSockets 和 AudioContext API。您无法控制浏览器缓冲。它由浏览器自己处理。
标签: javascript node.js html audio streaming