请问,有没有什么简单的方法来流式传输(广播)媒体文件(ogg,mp3,spx.)通过NODE.js和可能的SOCKET.IO从服务器到客户端(浏览器)?
我必须在服务器端录制音频输入,然后才能为许多客户端实时播放。我一直在摆弄binary.js或socket.io streams,但就是不能正确处理。
我曾尝试用speex,vorbis或lame对音频输入进行编码,然后通过FS将其加载到客户端,但我没有成功。或者我必须捕获PCM,然后在浏览器中解码它?
在这方面的任何建议,我都找不到任何帮助。
非常感谢您的任何提示、链接和想法。
发布于 2014-09-25 09:33:56
您需要查找在流上工作的包,然后根据需要通过管道将流传输到输出。使用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包也是围绕流构建的,所以它可能只是一个HTTP请求!
发布于 2014-05-09 03:42:04
在web浏览器上,您可以看到the HTML5 video element and the audio element。他们都有消息来源。所以如果你想流式传输mp3,你需要注意这一点。
你不需要socket.io,只需要超文本传输协议。您的应用程序正在读取文件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以及http和fs模块上使用ReadableStream.pipe方法。如果您想对音频文件进行代码转换(例如,从mp3到ogg),您需要找到一个模块来执行此操作,并通过管道将数据从文件传输到代码转换器,然后再传输到response
// using some magical transcoder
inputStream.pipe(transcoder).pipe(response);每当完成写入时,该方法都会在流上调用end,以便文件读取(和代码转换)完成后,HTTP请求就会完成。
发布于 2014-05-02 00:29:07
您可以使用node和RTC执行此操作。有一些工具可以随时使用,比如SimpleWebRTC或EasyRTC。对于我已经测试过的视频,仍然是一个麻烦,但音频工作得很好。
https://stackoverflow.com/questions/23396575
复制相似问题