如何使用低延迟流式传输实时音频

9

我编写了一个服务器,使用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);

在客户端,这个音频流的声音会被包含在一个<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上


当我使用206响应流式传输音频时,遇到了类似的问题,后来我发现使用MediaSource是一个不错的解决方案。在这个例子中,MediaSource 是用于视频的,但是很容易转换为只适用于音频的版本,也许这可以帮助您进一步解决问题。 - Jankapunkt
谢谢,我会去查看的。 - Patrick Hund
1
尝试使用另一个音频编解码器,比如opus,只是为了看看是否存在编解码器问题(但我真的不认为会有问题)。如果这对您的目的没有用,最好在客户端使用WebSockets和AudioContext API。您无法控制浏览器缓冲,它由浏览器本身处理。 - FonzTech
1个回答

4

与其重复劳动,你可以使用FFMPEG,它被称为“一个完整的跨平台解决方案,用于录制、转换和流传音频和视频。”

示例:

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

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


我终于尝试了你提出的解决方案,设置了FFmpeg并流式传输到Icecast服务器。然而,这根本没有减少延迟,甚至更糟,所以我不得不取消接受答案,以免误导其他人。 - Patrick Hund
不确定您是如何测试以及使用的硬件是什么。我们使用RPI3和Logitec C930进行网络流媒体测试,-preset ultrafast -tune zerolatency在我们的测试案例中能够很好地消除延迟。如果您真的需要证明,我可以稍后上传一个视频来展示。 - Dr Yuan Shenghai
那些预设和调整标志是针对视频的,不是音频,对吧? - Patrick Hund
这篇文章说基本上是浏览器和它的音频HTML元素的问题 - 浏览器总是通过设计缓冲,产生延迟。https://dev59.com/BWQn5IYBdhLWcg3wETk5#17151097 - Patrick Hund
1
就 HTML 方面,我不是很确定。我使用 FFmpeg 将机器人的视频和声音远程发送到地面站以消除延迟。是的,在您的情况下,这是一个不同的问题。 - Dr Yuan Shenghai
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接