将Float32Array缓冲到客户端

时间:2019-02-14 14:30:20

标签: node.js socket.io stream

这应该很明显,但是由于某种原因我没有得到任何结果。我已经花了太多时间,只是尝试了不同的方法来使这项工作没有结果。

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);
  });

我尝试使用流有两个原因:声音缓冲区很大,并且将来允许并发处理

1 个答案:

答案 0 :(得分:0)

如果要在发送类似Readable()的对象之前将对象Float32Array转换为buffer。push(Buffer.from(modifiedSoundBuffer))吗?