Нет метаданных при записи аудио webm с MediaRecorder

Для моего проекта я записываю пользовательское аудио с помощью MediaRecorder, и оно почти нормально работает. Моя проблема возникает, когда я хочу отобразить форму волны пользовательской записи, используя Wavesurfer.js, который не загружает мою запись. Тем не менее, воспроизведение записи с использованием элемента Audio работает нормально.

Попробовав разные источники, кажется, что в конечном файле.webm нет большого количества метаданных, даже длительности или битрейта (даже если я установил его в параметрах MediaRecorder). Вот вывод из ffprobe с одним из файлов:

Введите #0, matroska,webm, из '206_3.webm':
Метаданные:
кодировщик: Chrome
Продолжительность: N/A, начало: 0.000000, битрейт: N / A
Поток № 0:0(англ): аудио: opus, 48000 Гц, моно, fltp (по умолчанию)

Итак, мой вопрос: я делаю что-то не так для записи аудио? Вот как я начинаю запись:

// Somewhere in the code...
this._handleUserMedia(await navigator.mediaDevices.getUserMedia({ audio: true }));

// ... and elsewhere
_handleUserMedia(stream) {
    this._mediaRecorder = new MediaRecorder(stream, { audioBitsPerSecond : 64000 });

    this._mediaRecorder.ondataavailable = event => {
      this._mediaBuffer.push(event.data);
    };

    this._mediaRecorder.onstop = () => {
      // Ajoute le buffer et une URL vers le buffer dans les résultats pour la sauvegarde et le playback
      let blob = new Blob(this._mediaBuffer, { type: "audio/webm" });
      this.state.results[this.state.currentWordIdx].recordingBlob = blob;
      this.state.results[this.state.currentWordIdx].recordingUrl = URL.createObjectURL(blob);

      // Réinitialise le buffer pour l'enregistrement suivant
      this._mediaBuffer = [];

      this._gotoNextWord();
    };

    this._gotoNextWord();
  }

Как вы можете видеть, я создаю BLOB-объект, который позже сохраняю с помощью NodeJS. fs.writeFile, Затем, когда мне нужно отобразить форму волны, я загружаю файл, используя fs.readFile как это:

fs.readFile(`${this.getAppData()}/${filePath}`, (err, buffer) => {
    if (err) { reject(err); }
    const blob = new Blob([buffer], {type : 'audio/webm'});
    resolve(URL.createObjectURL(blob)); // Si besoin d'un ArrayBuffer => toArrayBuffer(buffer)
});

1 ответ

Я считаю, что причина такого небольшого количества метаданных заключается в том, что по умолчанию MediaRecorder создает файл с переменным битрейтом , для которого одно значение битрейта не имеет смысла — предположительно (хотя я не уверен), что приводит к отсутствию четкого значения длительности, поскольку Что ж.

Спецификация недавно позволила установить постоянный битрейт для записи , и скоро эта реализация появится в Chromium (M89).

Другие вопросы по тегам