如何在Node.js上从Web Audio API播放PCM流?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (71)

我使用网络音频API从浏览器流式传输录制的PCM音频。

我使用binaryJS(websocket连接)将其流式传输到nodejs服务器,并且我正尝试使用扬声器npm模块在服务器上播放该流。

音频缓冲器首先是非交错IEEE 32位线性PCM,其标称范围介于-1和+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包中的扬声器对象。

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文件并且播放效果良好。

提问于
用户回答回答于

将音频缓冲区转换为整数数组缓冲区。我选择使用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);

}

所属标签

可能回答问题的人

  • 应用案例分享

    1 粉丝490 提问5 回答
  • o o

    4 粉丝495 提问5 回答
  • uncle_light

    5 粉丝518 提问4 回答
  • 找虫虫

    5 粉丝0 提问3 回答

扫码关注云+社区

领取腾讯云代金券