[英]node (socket) live audio stream / broadcast
请问有没有简单的方法可以通过NODE.js和可能的SOCKET.IO从服务器到客户端(浏览器)传输(广播)媒体文件(ogg,mp3,spx ..)?
我必须在服务器端录制音频输入,然后才能为许多客户端实时播放。 我一直在搞乱binary.js或socket.io流,但是无法正确使用它。
我试图用speex,vorbis或lame对音频输入进行编码,然后通过FS将其加载到客户端,但我还没有成功。 或者我必须捕获PCM然后在浏览器中解码它?
对此有任何建议,我发现没有任何帮助过我。
非常感谢任何提示,链接和想法。
您将需要查找适用于Streams的软件包,并从那里开始根据需要将流输出到输出。 使用Express或仅使用内置HTTP,您可以非常轻松地完成此任务。 这是一个围绕osx-audio构建的示例,它提供了一个PCM流, lame可以将流编码为mp3,而Express:
var Webcast = function(options) {
var lame = require('lame');
var audio = require('osx-audio');
var fs = require('fs');
// create the Encoder instance
var encoder = new lame.Encoder({
// input
channels: 2, // 2 channels (left and right)
bitDepth: 16, // 16-bit samples
sampleRate: 44100, // 44,100 Hz sample rate
// output
bitRate: options.bitrate,
outSampleRate: options.samplerate,
mode: (options.mono ? lame.MONO : lame.STEREO) // STEREO (default), JOINTSTEREO, DUALCHANNEL or MONO
});
var input = new audio.Input();
input.pipe(encoder);
// set up an express app
var express = require('express')
var app = express()
app.get('/stream.mp3', function (req, res) {
res.set({
'Content-Type': 'audio/mpeg3',
'Transfer-Encoding': 'chunked'
});
encoder.pipe(res);
});
var server = app.listen(options.port);
}
module.exports = Webcast;
如何获得输入流可能是最有趣的部分,但这取决于您的实现。 流行的request
包也是围绕Streams构建的,所以它可能只是一个HTTP请求!
在Web浏览器上,您有HTML5视频元素和音频元素 。 他们俩都有消息来源。 每个Web浏览器本身都支持不同的编解码器。 所以如果你想尝试流式传输MP3,你会想要注意的。
你不需要socket.io,你只需要HTTP。 您的应用正在读取文件, music.ogg
,并且对于它读取的每个块,它将通过http服务器发送它。 它将是一个单独的HTTP请求,在文件传输之前一直保持打开状态。
以下是您的html的外观:
<audio src="http://example.com/music.ogg"></audio>
你的nodejs代码将是这样的(没有测试过):
var http = require('http');
var fs = require('fs');
http.on('request', function(request, response) {
var inputStream = fs.open('/path/to/music_file.ogg');
inputStream.pipe(response);
})
我只在inputStream
上使用ReadableStream.pipe方法,在上面的代码中使用http和fs模块。 如果要对音频文件进行转码(例如,从mp3转换为ogg),您将需要找到一个模块来执行该操作,并将数据从文件传输到转码器然后进入response
:
// using some magical transcoder
inputStream.pipe(transcoder).pipe(response);
只要文件完成写入,该方法就会在流上调用end
,这样一旦文件被读取(并进行转码),HTTP请求就会完成。
您可以使用node和RTC执行此操作。 有一些工具可以使用,如SimpleWebRTC或EasyRTC 。 对于我已经测试过的视频仍然是一个麻烦,但音频效果很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.