我有两个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());
输出到扬声器。这可能吗?
答案 0 :(得分:2)
好吧,pipe()
函数实际上意味着一个流链接到另一个流,例如,一个可读流可写。一旦在可读流上准备好任何数据块,以及诸如write()
和pause()
之类的稍微复杂的逻辑,该“链接”过程就是将resume()
写入可写流。 backpressure
。
因此,您要做的就是创建一个类似管道的函数,以同时处理两个可读流,这会从stream1和stream2中清空数据,一旦数据准备好,就将它们写入目标可写流中
强烈建议您阅读Stream
的Node.js文档。
希望这就是您想要的:)