'Decode audio from ArrayBuffer received over web-socket in node

I am trying to send audio over web-sockets to node server where I want to store it in local file system. I am able to append the data received in a file, but it is not playable.

Most of the solution I found are for client side which use AudioContext.decodeAudiodata().

client

localAudioStreamRecorder = getMediaStreamRecording(
    localAudioStream,
    'audio/webm;codecs=opus',
    (data: ArrayBuffer) => {
      handleSendRecordingChunk(socket, {
        ...getIdentityPayload({ sessionId, userId, role }),
        data,
        streamType: 'audio',
      })
    }
)

server

const audioStreamPass = fs.createWriteStream(audioFilePath, { flags: 'a' });
const newData = async (socket, eventData, cb) => {
  const { sessionId } = eventData.body;

  if (eventData.body.streamType === 'audio') {
    // Need help here
    audioStreamPass.write(Buffer.from(new Uint8Array(eventData.body.data)));
  }
};

I just want to know, how can I decode this data to something which is playable. Thanks.



Solution 1:[1]

Try this on server:

const { Readable } = require('stream');

const audioStreamPass = fs.createWriteStream(audioFilePath, { flags: 'a' });
const newData = async (socket, eventData, cb) => {
  const { sessionId } = eventData.body;

  if (eventData.body.streamType === 'audio') {
    // Create the readable stream from buffer
    const readableStream = Readable.from(buffer);
    //Pipe the stream to the writeable
    readableStream.pipe(audioStreamPass)  
};

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Cesare Polonara