【问题标题】:How to Stream Live Audio With Low Latency如何以低延迟流式传输实时音频
【发布时间】: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


【解决方案1】:

您可以使用FFMPEG,而不是重新发明轮子,宣传为“用于录制、转换和流式传输音频和视频的完整的跨平台解决方案”。

例子:

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

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

【讨论】:

  • 谢谢,这似乎是一个很好的解决方案。我冒昧地编辑了您的答案并授予您赏金。
  • 这是我的代码的简短示例。代码字“-preset ultrafast -tune zerolatency”也很重要。 lxterminal -e ffmpeg -f v4l2 -framerate 30 -video_size 800x448 -i /dev/video0 -i /home/pi/Desktop/sound/ic_ch.png -codec:v h264 -r 30 -s 800x448 -bf 0 -g 30 -bufsize 8000k -maxrate 8000k -filter_complex "[0:v][1:v] overlay=(Ww)/2:(Hh)/2:enable='gte(t,1)'" -preset ultrafast -tune zerolatency -f h264 udp://192.168.5.10:23003 & sleep 0.1
  • 我终于开始尝试您提出的解决方案,设置 FFmpeg,流式传输到 Icecast 服务器。唉,这对减少延迟毫无帮助,甚至更糟,所以我不得不不接受答案,以免误导其他人。
  • 不确定您是如何测试的以及您的硬件是什么。我们使用 RPI3 和 Logitec C930 进行了网络流媒体测试,-preset ultrafast -tune zerolatency 可以很好地消除我们测试用例的延迟。如果你真的需要证据,我可以稍后上传一个视频来展示这一点
  • HTML 方面我不太确定。我确实使用 FFmpeg 将机器人视频和声音远程发送到地面站以消除延迟。是的,在你的情况下,这是一个不同的问题
猜你喜欢
  • 2019-01-04
  • 2011-09-30
  • 2015-07-28
  • 2013-06-12
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2012-09-16
  • 2015-05-04
相关资源
最近更新 更多