节点(套接字)直播音频流/广播

时间:2014-04-30 19:34:26

标签: node.js sockets audio media

请问,有没有简单的方法可以通过NODE.js和可能的SOCKET.IO从服务器到客户端(浏览器)传输(广播)媒体文件(ogg,mp3,spx ..)?

我必须在服务器端录制音频输入,然后才能为许多客户端实时播放。 我一直在搞乱binary.js或socket.io流但却无法正确使用它。

我尝试用speex,vorbis或lame对音频输入进行编码,然后通过FS将其加载到客户端,但我还没有成功。或者我必须捕获PCM然后在浏览器中解码它?

对此有任何建议,我发现没有任何帮助过我。

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

3 个答案:

答案 0 :(得分:9)

您将需要查找适用于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请求!

答案 1 :(得分:4)

在网络浏览器上,您有the HTML5 video element and the audio element。他们俩都有消息来源。 Each web browser supports different codecs natively.如果您正在尝试播放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请求就会完成。

答案 2 :(得分:-1)

您可以使用node和RTC执行此操作。有一些工具可以使用,例如SimpleWebRTCEasyRTC。对于我已经测试过的视频仍然是一个麻烦,但音频效果很好。