这应该是显而易见的,但由于某种原因,我没有得到任何结果。我已经花了太多时间只是尝试不同的方法来使这个工作没有结果。
TLDR:解释这个问题的一个简短方法可能是:我知道如何从文件中传输声音。如何流式传输包含服务器上合成的声音的缓冲区?
这有效:
var stream = ss.createStream();
ss(socket).emit('get-file', stream, data.bufferSource);
var parts = [];
stream.on('data', function(chunk){
parts.push(chunk);
});
stream.on('end', function () {
var blob=new Blob(parts,{type:"audio"});
if(cb){
cb(blob);
}
});
var ss = require('socket.io-stream');
// ....
ss(socket).on('get-file', (stream:any, filename:any)=>{
console.log("get-file",filename);
fs.createReadStream(filename).pipe(stream);
});
现在,问题是:
我想改变这个音频缓冲区并发送修改后的音频而不仅仅是文件。我将ReadStream转换为Float32Array,并按样本进行了一些处理。现在我想将修改后的Float32Array发送给客户端。
在我看来,我只需要用fs.createReadStream(filename)
替换(new Readable()).push(modifiedSoundBuffer)
。但是,我得到了一个TypeError: Invalid non-string/buffer chunk
。有趣的是,如果我将这个modifiedSodunBuffer
转换为Uint8Array,它不会对我大喊大叫,而客户端会得到一个很大的数组,看起来不错;只是所有的数组值都是0.我猜它是所有值的地板?
ss(socket).on('get-buffer', (stream:any, filename:any)=>{
let readable=(new Readable()).push(modifiedFloat32Array);
readable.pipe(stream);
});
我试图使用流有两个原因:声音缓冲区很大,并允许将来进行并发处理
如果你将对象Float32Array转换为缓冲区之前发送像这样的Readable())。push(Buffer.from(modifiedSoundBuffer))?