这应该很明显,但是由于某种原因我没有得到任何结果。我已经花了太多时间,只是尝试了不同的方法来使这项工作没有结果。
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);
}
});
服务器(在socket.io的“套接字连接”回调中)
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);
});
我尝试使用流有两个原因:声音缓冲区很大,并且将来允许并发处理
答案 0 :(得分:0)
如果要在发送类似Readable()的对象之前将对象Float32Array转换为buffer。push(Buffer.from(modifiedSoundBuffer))吗?