首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node (socket)直播音频流/直播

node (socket)直播音频流/直播
EN

Stack Overflow用户
提问于 2014-05-01 03:34:26
回答 3查看 23.4K关注 0票数 14

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

我必须在服务器端录制音频输入,然后才能为许多客户端实时播放。我一直在摆弄binary.js或socket.io streams,但就是不能正确处理。

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

在这方面的任何建议,我都找不到任何帮助。

非常感谢您的任何提示、链接和想法。

EN

回答 3

Stack Overflow用户

发布于 2014-09-25 09:33:56

您需要查找在流上工作的包,然后根据需要通过管道将流传输到输出。使用Express或仅使用内置的HTTP就可以很容易地实现这一点。下面是一个围绕osx-audio构建的示例,它提供了一个PCM流,lame可以将流编码为mp3,以及Express:

代码语言:javascript
复制
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请求!

票数 16
EN

Stack Overflow用户

发布于 2014-05-09 03:42:04

在web浏览器上,您可以看到the HTML5 video element and the audio element。他们都有消息来源。所以如果你想流式传输mp3,你需要注意这一点。

你不需要socket.io,只需要超文本传输协议。您的应用程序正在读取文件music.ogg,并且对于它读取的每个块,它将通过http服务器发送它。它将是一个单独的HTTP请求,在文件传输之前一直保持打开状态。

下面是您的html的外观:

代码语言:javascript
复制
<audio src="http://example.com/music.ogg"></audio>

你的nodejs代码会是这样的(还没有测试过):

代码语言:javascript
复制
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

代码语言:javascript
复制
// using some magical transcoder
inputStream.pipe(transcoder).pipe(response);

每当完成写入时,该方法都会在流上调用end,以便文件读取(和代码转换)完成后,HTTP请求就会完成。

票数 5
EN

Stack Overflow用户

发布于 2014-05-02 00:29:07

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23396575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档