我已经对服务器进行了编程,该服务器使用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。
答案 0 :(得分:3)
您可以使用FFMPEG(宣传为“一个完整的,跨平台的解决方案来记录,转换和流式传输音频和视频”),而不用重新发明轮子。
示例:
ffmpeg -re -i input -f rtsp -muxdelay 0.1 rtsp://server/live.sdp
您可以选择浏览器可以使用的库(h.264,mpeg等)。