Odtwarzanie strumienia PCM z interfejsu API Web Audio w Node.js

Przesyłam nagrany dźwięk PCM z przeglądarki za pomocą api audio w sieci.

Przesyłam go strumieniowobinaryJS (połączenie websocket) do serwera nodejs i próbuję odtworzyć ten strumień na serwerze za pomocą modułu głośnika npm.

To jest mój klient.Bufory audio są najpierw bez przeplotu 32-bitowy liniowy PCM IEEE o nominalnym zakresie od -1 do +1. Biorę jeden z dwóch kanałów PCM, aby rozpocząć i przesłać go poniżej.

var client = new BinaryClient('ws://localhost:9000');
var Stream = client.send();

recorder.onaudioprocess = function(AudioBuffer){
    var leftChannel = AudioBuffer.inputBuffer.getChannelData (0);
    Stream.write(leftChannel);
}

Teraz otrzymuję dane jako bufor i próbuję napisać je do obiektu głośnika z pakietu 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);
        });
    });
});

Efektem jest piskliwy dźwięk na głośnikach mojego laptopa, co wyraźnie nie jest tym, co jest nagrywane. To też nie jest informacja zwrotna. Mogę potwierdzić, że bufory zapisu na kliencie są prawidłowe, ponieważ próbowałem je zapisać w pliku WAV i odtwarzał dobrze.

Thedokumenty do głośnika idocs do AudioBuffera w pytaniu

Byłem na tym zakłopotany od wielu dni. Czy ktoś może dowiedzieć się, co jest nie tak lub może zaoferować inne podejście?

Aktualizacja za pomocą rozwiązania

Po pierwsze, niepoprawnie korzystałem z API websocket. Zaktualizowałem powyżej, aby używać go poprawnie.

Musiałem przekonwertować bufory audio na bufor tablicy liczb całkowitych. Wybieram użycieInt16Array. Ponieważ dany bufor audio ma zakres między 1 a -1, był tak prosty, jak mnożenie przez zakres nowego ArrayBuffera (32767 do -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);

}

questionAnswers(1)

yourAnswerToTheQuestion