节点(套接字)实时audiostream/广播

请问,是否有任何简单的方法通过NODE.js和可能的SOCKET.IO从服务器到客户端(浏览器)stream媒体文件(ogg,mp3,spx ..)?

我必须在服务器端loggingaudioinput,然后能够为许多客户端实时播放。 我已经搞乱了binary.js或socket.iostream,但没有能够得到它的权利。

我试图用speex,vorbis或lame编码audioinput,然后通过FS将它加载到客户端,但是我没有成功。 或者我必须捕获PCM,然后在浏览器中解码?

对此的任何build议,没有任何我发现曾经帮助过我。

非常感谢任何提示,链接和想法。

您将需要查找在Streams上运行的软件包,并从那里只需要将streampipe道输出为必要的输出。 使用快速或只是内置的HTTP,你可以很容易地做到这一点。 这是一个围绕osx-audio构build的例子,它提供了一个PCMstream,可以将一个stream编码为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; 

如何获得inputstream可能是最有趣的部分,但这取决于您的实现。 stream行的request包也是围绕Streams构build的,所以它可能只是一个HTTP请求而已!

在networking浏览器上,您有HTML5video元素和audio元素 。 他们都有消息来源。 每个Web浏览器都支持不同的编解码器。 所以,如果你想要stream式传输mp3,那么你需要注意这一点。

你不需要socket.io,你只需要HTTP。 你的应用程序正在读取一个文件music.ogg ,并且每读取一个文件块,它都会通过http服务器发送它。 这将是一个单一的HTTP请求,直到文件传输保持打开状态。

下面是你的html的样子:

 <audio src="http://example.com/music.ogg"></audio> 

而你的nodejs代码会是这样的(没有testing过):

 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方法。 如果你想转换audio文件(例如,从mp3到ogg),你会想find一个模块来做到这一点,并将数据从文件传输到代码转换器,然后进行response

 // using some magical transcoder inputStream.pipe(transcoder).pipe(response); 

每当完成写操作时,该方法将在stream上调用end ,以便一旦完成文件的读取(和转码),HTTP请求就会完成。

你可以用节点和RTC来做到这一点。 有一些工具可以像SimpleWebRTC或EasyRTC一样使用。 对于我已经testing过的video来说还是一个麻烦,但是audio效果很好。