【问题标题】:Node JS radio (audio stream)Node JS 广播(音频流)
【发布时间】:2018-05-23 18:11:27
【问题描述】:

晚上好!我只是尝试使用 Node JS 制作自己的网络广播。我看到了很多关于它的问题和教程,但都是老的,很难理解。

const fs = require('fs'),
files = fs.readdirSync('./music'), // I have some mp3 in music folder
clips = [],
dhh = fs.createWriteStream('./tracks.mp3'); // create output stream

let stream, currentfile;

files.forEach(file => {
  clips.push(file);
});

// recursive function
const main = () => {
  if (!clips.length) {
    dhh.end('Done');
    return;
  }

  currentfile = './music/' + clips.shift();
  stream = fs.createReadStream(currentfile);

  stream.pipe(dhh, { end: false });

  stream.on('end', function() {
    console.log(currentfile + ' appended');
    main();
  });
};

main();

所以我将所有的 mp3 都放在一个文件中。当他们连接时,我该怎么做才能将此文件流式传输给许多不同的用户。很多关于它的答案建议使用 BinaryJS,但它是大约 5 年前写的。 我只是不知道如何开始,所以我需要你的帮助。谢谢!

我试过这样的

const http = require('http'),
fs = require('fs'),
filePath = './music/my.mp3',
stat = fs.statSync(filePath);

http.createServer(function(request, response) {
  fs.createReadStream(filePath).pipe(response);

  response.writeHead(200, {
    'Content-Type': 'audio/mpeg',
    'Content-Length': stat.size,
  });

}).listen(4000);

当用户连接到端口 4000 时,音乐开始播放,但它不是在线的东西,当另一个用户连接时,音乐也从头开始播放,但我想像在线收音机一样做。但它不起作用:(

【问题讨论】:

标签: node.js audio-streaming internet-radio


【解决方案1】:

我也在尝试做同样的事情,发现了一篇内容丰富的博客文章here。其中只有一件事,它没有解释如何向服务器添加可写/消费者,所以它是不完整的。但是你可以用剩下的部分来创建你的收音机的 90%。我也使用了不同的方法,所以我想在这里分享它来帮助另一个灵魂。 ('writable1'未定义)欢迎更正代码。

const express = require('express'),
    router  = express.Router(),
    fs      = require('fs');
    Throttle = require('throttle'),
    ffprobe = require('ffprobe'),
    ffprobeStatic = require('ffprobe-static');

    // Play all songs from db
    router.get('/', function(req, res){

    const bitRate = ffprobe('myAudio.mp3', { path: ffprobeStatic.path }, function(err, info){
        console.log(info.streams[0].bit_rate);
    });
    const readable = fs.createReadStream('myAudio.mp3');
    const throttle = new Throttle(bitRate / 8);
    const writables = [writable1, writable2, writable3];

    readable.pipe(throttle).on('data', (chunk) => {
           for (const writable of writables) {
           writable.write(chunk);
         }
      });

    });

    module.exports = router;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 2011-10-20
    • 1970-01-01
    • 2013-01-08
    • 2012-03-23
    • 2011-07-19
    • 2012-05-13
    • 2023-03-28
    相关资源
    最近更新 更多