【发布时间】:2019-07-08 14:53:01
【问题描述】:
这应该很明显,但由于某种原因,我没有得到任何结果。我已经花了太多时间尝试不同的方法来让这个工作没有结果。
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 的 'socket-connected' 回调中)
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);
});
我尝试使用流有两个原因:声音缓冲区很大,并且允许将来进行并发处理
【问题讨论】:
-
嗨@Joaquin,您是否设法修改服务器上的音频并将其实时发送回客户端?
-
嗨!对不起,我后来没有回来,我认为人们应该这样做。这是很久以前的事了。我想我没有设法解决问题,不得不解决。不过,我确信有一个解决方案。是否值得花时间是另一个问题。