将PCM-Streams管道化为一个功能

时间:2016-09-24 16:41:05

标签: node.js audio stream pcm

我有两个PCM流(decoder1 + decoder2):

var readable1 = fs.createReadStream("track1.mp3");
var decoder1 = new lame.Decoder({
    channels: 2,
    mode: lame.STEREO
});
readable1.pipe(decoder1);

var readable2 = fs.createReadStream("track2.mp3");
var decoder2 = new lame.Decoder({
    channels: 2,
    mode: lame.STEREO
});
readable2.pipe(decoder2);

现在我想把流管道化为一个mix-function,我可以使用缓冲区函数,如:

function mixStream(buf1, buf2, callback) {
    // The mixStream-Function is not implemented yet (dummy)
    var out = new Buffer(buf1.length);
    for (i = 0; i < buf1.length; i+=2) {
        var uint = Math.floor(.5 * buf1.readInt16LE(i));
        out.writeInt16LE(uint, i);
    }

    this.push(out);
    callback();
}

我需要像

这样的东西
mixStream(decoder1.pipe(), decoder2.pipe(), function() { }).pipe(new Speaker());

输出到扬声器。这可能吗?

1 个答案:

答案 0 :(得分:2)

好吧,pipe()函数实际上意味着一个流链接到另一个流,例如,一个可读流可写。一旦在可读流上准备好任何数据块,以及诸如write()pause()之类的稍微复杂的逻辑,该“链接”过程就是将resume()写入可写流。 backpressure

因此,您要做的就是创建一个类似管道的函数,以同时处理两个可读流,这会从stream1和stream2中清空数据,一旦数据准备好,就将它们写入目标可写流中

强烈建议您阅读Stream的Node.js文档。

希望这就是您想要的:)