0

我正在使用 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 扬声器模块是一个可写流,因此我应该能够通过管道传输到它。

我上面的解决方案会产生大约 30 秒的静态噪音,然后退出并出现“进程以退出代码 132 完成(被信号 4 中断:SIGILL)”错误。

我是 NodeJS 等的新手,所以对此的任何帮助将不胜感激。

谢谢

4

1 回答 1

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);
于 2017-06-04T17:14:58.897 回答