Это должно быть очевидно, но по какой-то причине я не получаю никакого результата.Я уже потратил слишком много времени, просто пытаясь разными способами заставить это работать без результатов.
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);
});
Я пытаюсь использовать потоки по двум причинам: звуковые буферы велики и для одновременной обработки в будущем