我是node的新手,我正在制作音频流服务器。我正试图处理/转换流的块,因为它们从每个管道出来。
所以,file = fs.createReadStream(path)
(文件流)是管道到file.pipe(wavy)
(删除头和输出原始PCM)管道到.pipe(waver)
(添加适当的wav头块)管道到.pipe(spark)
(输出块到客户端)。
这个想法是每个文件流块删除头(如果有的话)(只适用于第一个块),然后使用node-wav Writer块被赋予头,然后发送到客户端。我敢肯定你猜到这是行不通的。
对node- wave的管道操作作用于整个文件流,而不是单个块。为了确认我已经检查了输出客户端,并且它有效地删除了标头并将它们重新添加到整个数据流中。
从我读过的Node流文档看来,我想做的事情应该是可能的,只是不是我做的方式。我只是不能确定如何完成这件事。
这是可能的吗?如果是的话,我错过了什么?
完成功能:
processAudio = (path, spark) ->
wavy = new wav.Reader()
waver = new wav.Writer()
file = fs.createReadStream(path)
file.pipe(wavy).pipe(waver).pipe(spark)
我不太了解wave和header,但是如果你"尝试处理/转换从每个管道流出的流块",你可以使用transform流。
它允许你坐在两个流之间并修改它们之间的字节:
var util = require('util');
var Transform = require('stream').Transform;
util.inherits(Test, Transform);
function Test(options) {
Transform.call(this, options);
}
Test.prototype._transform = function(chunk, encoding, cb) {
// do something with chunk, then pass a modified chunk (or not)
// to the downstream
cb(null, chunk);
};
要观察流并可能对其进行修改,可以像下面这样:
file.pipe(wavy).pipe(new Test()).pipe(waver).pipe(spark)