Запись и сохранение аудиофайла становится странным - PullRequest
1 голос
/ 26 мая 2020

Я начал создавать приложение Electron, которое записывает аудио и сохраняет его. Я могу записать звук и сохранить его, а затем я могу его воспроизвести. Но когда я играю, происходит что-то странное. Вот как это выглядит на Groovy плеере:

enter image description here

А также в VL C, слева и правильно.

Это код, когда я останавливаю запись

mediaRecorder.addEventListener("stop", async () => {
  const audioBlob = new Blob(audioChunks, { type: "audio/wav" });
  const buffer = Buffer.from(await audioBlob.arrayBuffer());

  const { filePath } = await dialog.showSaveDialog({
    buttonLabel: "Save Audio",
    defaultPath: `aud-${Date.now()}.wav`,
  });
  writeFile(filePath, buffer, () =>
    console.log("Audio saved successfully")
  );
});

Я также пытался изменить его на ogg, но все равно есть та же проблема. СПАСИБО ЗАРАНЕЕ!

1 Ответ

0 голосов
/ 27 мая 2020

Думаю, причина ошибки - несоответствие аудиокодеков.

Вы можете легко воспроизвести его с помощью следующего кода.

Он записывает звук с микрофона в течение 2 секунд, воссоздает новый BLOB-объект в формате audio/wav и загружает его. Он даже получает 435:13:24 время правильно.

(async() => {

  const microphoneAudioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
  const stream = audio.captureStream();
  const mediaRecorder = new MediaRecorder(microphoneAudioStream);

  mediaRecorder.addEventListener('dataavailable', (event) => {
    const blob = event.data;

    const blobType = "audio/wav";
    const extension = "wav";

    //const blobType = blob.type;
    //const extension = "webm";

    const audioBlob = new Blob([blob], { type: blobType });
    const anchor = document.createElement("a");
    const url = window.URL.createObjectURL(audioBlob);
    anchor.href = url;
    anchor.download = `test.${extension}`;
    anchor.click();
    window.URL.revokeObjectURL(url);
  });

  mediaRecorder.start();

  setTimeout(() => {
    mediaRecorder.stop();
  }, 2000)

})();

В моем случае я попытался создать новый blob из audio/webm;codecs=opus данных.

Есть три решения.

  • Вы можете сохранить тот же формат, что и исходный BLOB-объект.
  • Добавьте еще один параметр в конструктор MediaRecorder объект параметров с mimeType
  • Найдите API, который преобразует от audio/webm до audio/wav
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...