Как обработать аудиопоток - PullRequest
0 голосов
/ 12 апреля 2020

Я совершенно неопытен в работе с потоками данных и хотел передать getUserMedia в опус-конвертер в качестве учебного проекта, а затем - возможно, слишком наивно - отправить его через socket.io. Моя, может быть, ошибочная идея заключается в том, что я постоянно делю и преобразовываю поток по частям.

Я благодарен за все объяснения, которые немного лучше объясняют общую обработку потока, так как я сказал, что это учебный проект, я знаю, что с WebRT C доступно гораздо лучшее решение.

В качестве кодера я хотел использовать https://github.com/ImagicTheCat/libopusjs. Альтернативы приветствуются, но я хотел бы придерживаться идеи кодировщика на основе wasm.

Что у меня есть (в качестве первого шага, моя идея заключалась в том, чтобы кодировать поток, декодировать и выводить его снова):

if (navigator.mediaDevices) {
      console.log('getUserMedia supported.');
      navigator.mediaDevices.getUserMedia ({audio: true, video: true})
      .then(function(stream) {
          video.srcObject = stream;
          video.onloadedmetadata = function(e) {
              video.play();
              video.muted = true;
          };

          var audioCtx = new AudioContext();
          var source = audioCtx.createMediaStreamSource(stream);


          var enc = new libopus.Encoder(1,48000,24000,20,false);
=> enc stream
          var dec = new libopus.Decoder(1,48000);

=> perspectively send this enc stream via socketio
=> dec enc stream => RESULT stream




          RESULT.connect(audioCtx.destination);

      })
      .catch(function(err) {
          console.log('The following gUM error occured: ' + err);
      });
  } else {
     console.log('getUserMedia not supported on your browser!');
  }

1 Ответ

1 голос
/ 28 апреля 2020

Вы видели эти модули WASM?

  • опус-рекордер кодирует / декодирует Ogg Opus и предоставляет множество опций.
  • opus-stream-decoder более ограничен, но декодирует Ogg Opus асинхронно порциями.
...