Javascript Node — Возможно редактировать аудио из mediastream на сервере и отправлять его обратно клиенту?

#javascript #node.js #audio #web-audio-api

#javascript #node.js #Аудио #web-audio-api

Вопрос:

Итак, я пытаюсь манипулировать аудио, которое поступает от клиента на сервер, а затем возвращать заново обработанный аудио обратно клиенту. Конечно, это приводит к ошибке, что Node не поддерживает web-audio-api, поэтому я использую узловую версию web-audio-api вместе с библиотекой WebRTC.

Поскольку я новичок в мире WebRTC, я опирался на эти примеры, в которых используется библиотека WebRTC. Используя пример audio-video-loopback в качестве отправной точки, я использовал некоторые из библиотек none standard API для создания аудиоприемника, который позволяет мне напрямую обращаться к сэмплам с клиента. На данный момент я просто хочу изменить громкость, поэтому я просто меняю значения и вставляю их в новую дорожку, как сказано в документе (прокрутите вниз до Programmatic Audio), чтобы сделать это. В конце я просто хочу вернуться к недавно созданной дорожке, что делается с помощью .replaceTrack метода (который, я полагаю, повторно запускает повторное согласование).

Вот что я получил на данный момент для кода сервера (клиент такой же, как исходный пример, найденный по ссылке выше):

 const { RTCAudioSink, RTCAudioSource } = require("wrtc").nonstandard;

function beforeOffer(peerConnection) {
  const audioTransceiver = peerConnection.addTransceiver("audio");
  const videoTransceiver = peerConnection.addTransceiver("video");

  let { track } = audioTransceiver.receiver;

  const source = new RTCAudioSource();
  const newTrack = source.createTrack();
  const sink = new RTCAudioSink(track);

  const sampleRate = 48000;
  const samples = new Int16Array(sampleRate / 100); // 10 ms of 16-bit mono audio

  const dataObj = {
    samples,
    sampleRate,
  };

  const interval = setInterval(() => {
    // Update audioData in some way before sending.
    source.onData(dataObj);
  });

  sink.ondata = (data) => {
    // Do something with the received audio samples.
    const newArr = data.samples.map((el) => el * 0.5);
    dataObj[samples] = newArr;
  };

  return Promise.all([
    audioTransceiver.sender.replaceTrack(newTrack),
    videoTransceiver.sender.replaceTrack(videoTransceiver.receiver.track),
  ]);
}
  

Неудивительно, что это не работает, я просто получаю тишину обратно, даже если dataObj содержит правильно обработанные сэмплы, которые затем передаются newTrack при source.onData вызове.

Возможно ли то, что я пытаюсь сделать, даже на стороне сервера? Любые предложения приветствуются, как я уже сказал, я новичок в WebRTC.