在Node.js上从Web Audio API播放PCMstream

我使用networkingaudioAPI从浏览器stream式传输录制的PCMaudio。

我将它与binaryJS(websocket连接)stream到一个nodejs服务器,我试图播放该stream使用扬声器npm模块在服务器上。

这是我的客户。 audio缓冲器首先是非交织的IEEE 32位线性PCM,标称范围在-1和+1之间 。 我从两个PCM通道中的一个开始,并在下面进行stream式处理。

var client = new BinaryClient('ws://localhost:9000'); var Stream = client.send(); recorder.onaudioprocess = function(AudioBuffer){ var leftChannel = AudioBuffer.inputBuffer.getChannelData (0); Stream.write(leftChannel); } 

现在我接收到数据作为缓冲区,并尝试将其写入npm包中的扬声器对象。

 var Speaker = require('speaker'); var speaker = new Speaker({ channels: 1, // 1 channel bitDepth: 32, // 32-bit samples sampleRate: 48000, // 48,000 Hz sample rate signed:true }); server.on('connection', function(client){ client.on('stream', function(stream, meta){ stream.on('data', function(data){ speaker.write(leftchannel); }); }); }); 

结果是我的笔记本电脑的扬声器发出尖锐的尖叫声,这显然不是被logging的。 这也不是反馈。 我可以确认客户端上的录制缓冲区是有效的,因为我试图将它们写入WAV文件,并且播放效果良好。

发言人的文档和有关AudioBuffer的文档

我被困在这个好几天了。 有人可以找出什么是错的或者可能提供一个不同的方法?

更新与解决scheme

首先,我错误地使用了websocket API。 我更新以上正确使用它。

我需要将audio缓冲区转换为整数数组缓冲区。 我select使用Int16Array 。 由于给定的audio缓冲区的范围介于1到-1之间,因此它与新的ArrayBuffer(32767到-32768)的范围相乘那么简单。

 recorder.onaudioprocess = function(AudioBuffer){ var left = AudioBuffer.inputBuffer.getChannelData (0); var l = left.length; var buf = new Int16Array(l) while (l--) { buf[l] = left[l]*0xFFFF; //convert to 16 bit } Stream.write(buf.buffer); } 

它看起来像你发送你的stream作为meta对象。

根据文档, BinaryClient.send以该BinaryClient.send获取data对象(stream)和meta对象。 stream事件的callback在第一个参数中接收stream(作为BinaryStream对象,不是Buffer ),在第二个参数中接收meta对象。

您将send()string作为stream,将getChannelData()Float32Array作为元对象Float32Array 。 也许如果你要交换这两个参数(或者只是使用client.send(leftChannel) ),然后更改服务器代码,将stream递给speaker.write而不是leftchannel (可能应该重命名为meta ,或者如果不不需要它),它可能工作。

请注意,由于Float32Array不是stream或缓冲区对象,BinaryJS可能会尝试将其发送到一个块中 。 您可能需要发送leftChannel.buffer ( 该对象后面的ArrayBuffer )。

让我知道这是否适合你 我现在无法testing您的确切设置。