节点JS广播(音频流)

时间:2017-12-09 19:26:40

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

晚上好!我只是尝试使用Node JS做自己的网络电台。我看到了很多关于它的问题和教程,但所有这些都是陈旧且难以理解的。

Promise.all

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

我试过这样的事情

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();

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

1 个答案:

答案 0 :(得分:0)

我也在尝试做与您相同的事情,并且发现了一篇非常有用的博客文章here。里面只有一件事,它没有解释如何向服务器添加可写对象/使用者,因此它是不完整的。但是您可以用其余的广播创建90%的广播。另外,我使用了不同的方法,因此我想在这里分享它,以帮助另一个人。 (未定义“可写1”),请随时更正代码。

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;