我正在使用web音频api从浏览器流式传输录制的PCM音频。
我正在使用binaryJS (websocket connection)将其流式传输到nodejs服务器,并尝试使用扬声器npm模块在服务器上播放该流。
这是我的委托人。The audio buffers are at first non-interleaved IEEE 32-bit linear PCM with a nominal range between -1 and +1。我选择两个PCM通道中的一个开始并在下面流式传输它。
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包中的speaker对象。
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);
});
});
});
结果是我的笔记本电脑的扬声器发出了刺耳的尖叫声,这显然不是正在录制的东西。这也不是反馈。我可以确认客户端上的录制缓冲区是有效的,因为我尝试将它们写入WAV文件,并且播放正常。
有问题的docs for speaker和docs for the AudioBuffer
我已经被这个问题困扰了好几天了。有人能找出哪里出了问题吗?或者提供一种不同的方法?
使用solution更新
首先,我错误地使用了websocket API。我更新了上面的内容以正确使用它。
我需要将音频缓冲区转换为整数数组缓冲区。我选择使用Int16Array。由于给定的音频缓冲区的范围介于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);
}
https://stackoverflow.com/questions/20876152
复制相似问题