Для своего проекта я записываю пользовательский звук с помощью MediaRecorder, и он почти отлично работает. Моя проблема возникает, когда я хочу отобразить форму волны записи пользователя с помощью Wavesurfer.js, который не загружает мою запись. Однако воспроизведение записи с помощью элемента Audio работает нормально.
Попробовав разные источники, кажется, что это связано с тем, что окончательный файл .webm не имеет большого количества метаданных, даже продолжительности или битрейта (хотя я установил его в параметрах MediaRecorder). Вот результат работы ffprobe с одним из файлов:
Input #0, matroska,webm, from '206_3.webm':
Metadata:
encoder : Chrome
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0(eng): Audio: opus, 48000 Hz, mono, fltp (default)
Итак, мой вопрос: я что-то делаю не так, чтобы записывать звук? Вот как я начинаю запись:
// 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)
});
Я не. С тех пор я ушел из проекта.
Я считаю, что метаданных так мало потому, что по умолчанию MediaRecorder создает файл переменная скорость передачи данных, для которого одно значение битрейта не имеет смысла - предположительно (хотя я не уверен), что также приводит к отсутствию четкого значения продолжительности.
Спецификация недавно разрешила установить постоянный битрейт для записи с реализация скоро появится в Chromium (M89)
ты нашел решение своей проблемы?