Можно ли получить необработанные значения аудиоданных с помощью MediaRecorder () - PullRequest
1 голос
/ 07 апреля 2020

Я использую MediaRecorder () с getUserMedia () для записи аудиоданных из браузера. Это работает, но записанные данные записываются в формате Blob. Я хочу получать необработанные аудиоданные (амплитуды), а не BLOB-объекты. Возможно ли это сделать?

Мой код выглядит так:

  navigator.mediaDevices.getUserMedia({audio: true, video: false}).then(stream => {
    const recorder = new MediaRecorder(stream);
    recorder.ondataavailable = e => {
      console.log(e.data); // output: Blob { size: 8452, type: "audio/ogg; codecs=opus" }
    };
    recorder.start(1000); // send data every 1s
  }).catch(console.error);

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

MediaRecorder полезен для создания файлов; если вы хотите обрабатывать аудио, лучше всего подойдет Web Audio. См. это руководство по HTML5Rocks , в котором показано, как интегрировать getUserMedia с Web Audio, используя createMediaStreamSource из Web Audio.

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

Нет необходимости в MediaRecorder. Используйте веб-аудио для получения доступа к необработанным значениям данных, например , например :

navigator.mediaDevices.getUserMedia({audio: true})
.then(spectrum).catch(console.log);

function spectrum(stream) {
  const audioCtx = new AudioContext();
  const analyser = audioCtx.createAnalyser();
  audioCtx.createMediaStreamSource(stream).connect(analyser);

  const canvas = div.appendChild(document.createElement("canvas"));
  canvas.width = window.innerWidth - 20;
  canvas.height = window.innerHeight - 20;
  const ctx = canvas.getContext("2d");
  const data = new Uint8Array(canvas.width);
  ctx.strokeStyle = 'rgb(0, 125, 0)';

  setInterval(() => {
    ctx.fillStyle = "#a0a0a0";
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    analyser.getByteFrequencyData(data);
    ctx.lineWidth = 2;
    let x = 0;
    for (let d of data) {
      const y = canvas.height - (d / 128) * canvas.height / 4;
      const c = Math.floor((x*255)/canvas.width);
      ctx.fillStyle = `rgb(${c},0,${255-x})`;
      ctx.fillRect(x++, y, 2, canvas.height - y)
    }

    analyser.getByteTimeDomainData(data);
    ctx.lineWidth = 5;
    ctx.beginPath();
    x = 0;
    for (let d of data) {
      const y = canvas.height - (d / 128) * canvas.height / 2;
      x ? ctx.lineTo(x++, y) : ctx.moveTo(x++, y);
    }
    ctx.stroke();
  }, 1000 * canvas.width / audioCtx.sampleRate);
};
...