我正在使用MEAN堆栈创建音乐流媒体服务。到目前为止,我已经编写了使用GridFS将mp3文件上传到我的MongoDB数据库的代码,我也可以将该文件下载到我网站的根文件夹中。
但是,我不希望下载流写入文件,而是流式传输到播放器/扬声器,以便文件不在用户的系统上,只需从服务器流式传输。
我一直在关注npm扬声器模块,并试图按如下方式实现它:
var assert = require('assert');
var fs = require('fs');
var mongodb = require('mongodb');
var Speaker = require('speaker');
var uri = 'mongodb://localhost:27017/test';
var speaker = new Speaker({
channels: 2, // 2 channels
bitDepth: 16, // 16-bit samples
sampleRate: 44100 // 44,100 Hz sample rate
});
mongodb.MongoClient.connect(uri, function(error, db) {
assert.ifError(error);
var bucket = new mongodb.GridFSBucket(db, {
chunkSizeBytes: 1024,
bucketName: 'songs'
});
bucket.openDownloadStreamByName('testmp3.mp3').pipe(speaker)
});
我不确定是否需要实现缓冲区才能执行此操作。据我所知,npm扬声器moudule是一个可写的流,所以我应该能够管道它。
我上面的解决方案产生大约30秒的静态噪声,然后退出"过程完成退出代码132(被信号4中断:SIGILL)"错误。
我是NodeJS等的新手,所以对此的任何帮助都将非常感激。
由于
答案 0 :(得分:0)
你需要一个解码器来解码mp3文件。
const lame = require('lame');
// create the Encoder instance
let decoder = new lame.Decoder({
// pcm output
channels: 2, // 2 channels (left and right)
bitDepth: 16, // 16-bit samples
sampleRate: 44100, // 44,100 Hz sample rate
// mp3 input
bitRate: 128,
outSampleRate: 44100,
mode: lame.STEREO // STEREO (default), JOINTSTEREO, DUALCHANNEL or MONO
});
// Create the Speaker instance
let speaker = new Speaker({
channels: 2, // 2 channels
bitDepth: 16, // 16-bit samples
sampleRate: 44100 // 44,100 Hz sample rate
});
bucket.openDownloadStreamByName('testmp3.mp3').pipe(decoder);
decoder.pipe(speaker);