如何以低延迟流媒体直播音频

Pat*_*und 8 javascript audio streaming html5 node.js

我已经对服务器进行了编程,该服务器使用expressosx-audiolame从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);
Run Code Online (Sandbox Code Playgroud)

在客户端,此音频流中的声音作为<audio>元素包括在内,如下所示:

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

可行–当我单击音频元素上的“播放”按钮时,可以从连接到服务器的任何浏览器上从笔记本电脑上选择的输入源听到声音。

但是,浏览器播放的音频比原始信号落后几秒钟。似乎,尽管我正在使用preload="none",但浏览器在开始播放之前会缓冲很多音频流。

这里有明显的遗漏吗?有没有更好的方法可以以几毫秒的延迟而不是几秒钟的时间来获得实时音频?

如果您有兴趣,我项目的完整源代码在GitHub上

Dr *_*hai 4

您可以使用FFMPEG,而不是重新发明轮子,广告为 \xe2\x80\x9cA 完整的跨平台解决方案来记录、转换和流式传输音频和视频。\xe2\x80\x9d

\n\n

例子:

\n\n
ffmpeg -re -i input -f rtsp -muxdelay 0.1 rtsp://server/live.sdp\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以选择您的浏览器可以使用的库(h.264、mpeg 等)。

\n