【问题标题】:Buffering a Float32Array to a client将 Float32Array 缓冲到客户端
【发布时间】: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,您是否设法修改服务器上的音频并将其实时发送回客户端?
  • 嗨!对不起,我后来没有回来,我认为人们应该这样做。这是很久以前的事了。我想我没有设法解决问题,不得不解决。不过,我确信有一个解决方案。是否值得花时间是另一个问题。

标签: node.js socket.io stream


【解决方案1】:

如果您将对象 Float32Array 转换为缓冲区,然后像这样 Readable()).push(Buffer.from(modifiedSoundBuffer)) 发送?

【讨论】:

  • 现在它不显示错误,但它不再被客户端识别为音频。我会继续找出为什么改天。可能有太多变数在起作用
  • 在任何情况下流都在使用字符串或缓冲区。要发送对象,您需要切换到“对象模式”。只需在 man 中阅读即可。
猜你喜欢
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2018-12-01
  • 2019-03-03
  • 2017-02-20
  • 2013-10-27
  • 2021-04-02
相关资源
最近更新 更多