使用npm speaker作为GridFS下载流的输出 - NodeJS

时间:2016-11-26 16:45:22

标签: node.js mongodb express npm node-speaker

我正在使用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等的新手,所以对此的任何帮助都将非常感激。

由于

1 个答案:

答案 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);