晚上好!我只是尝试使用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时,音乐开始播放,但它不是在线的东西,当另一个用户连接音乐也从头开始播放,但我想像在线广播一样。但它不起作用:(
答案 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;