节点(套接字)实时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效果很好。
- Cloud 9 IDE上的Socket.io – 警告:错误提出:错误:听EACCES
- 如何closuresAngular 2/4 +和Socket.io中的websocket
- 将多个消息发送到Node.js tcp套接字时,它们将作为单个消息进行stream式传输
- 聊天/系统通讯应用程序(Nodejs + RabbitMQ)
- Socket IO Client接收对象与服务器发送的不同
- Socket.io:如何让每个人都获得不同的渠道?
- vue的socket.io连接尝试返回“否”访问控制允许来源“标题存在”错误即使已设置的来源
- 如何杀死nodejs中的连接
- ExpressJS,MongoDB + Socket.IO – 识别单个用户会话