Я записываю речь с помощью MediaRecorder API, почему куски меньше, чем фактический размер?
У меня проблема с MediaRecorder API ( https://www.w3.org/TR/mediastream-recording/).
Я использую его для записи речи с веб-страницы, используя Chrome, и сохраняю ее как фрагменты. Мне нужно иметь возможность проигрывать его во время и после записи, поэтому важно сохранить эти фрагменты.
Вот код, который записывает данные:
navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(function(stream) {
recorder = new MediaRecorder(stream, { mimeType: 'audio/webm; codecs="opus"' })
var previous_timecode = null
recorder.ondataavailable = function(e) {
duration = previous_timecode ? e.timecode - previous_timecode : null
previous_timecode = e.timecode
// Read blob from `e.data`, decode64 and send to sever;
// Additionally send the duration calculated from the events;
// Duration of first chunk is calculated in a different way.
}
recorder.start(1000)
})
Проблема действительно произошла только один раз, но все же она довольно страшная. Проблема была в том, что за 7 минут записи я получил только 5 минут звука. Анализ фрагментов дал мне следующие данные - в какой-то момент фрагменты стали намного меньше, чем ожидалось - данные генерировались каждую секунду, но длительность фрагментов составляла около 400-700 мс.
Звук был правильным, у него не было никаких пробелов, он просто пришел с растущей задержкой. В некоторых моментах длительность чанка немного увеличивалась - до 4,8 с в чанке, но общая задержка все же росла до ~2 мин.
В прикрепленном файле CSV https://transfer.sh/stgnW/1.csv вы можете видеть длительности каждого чанка, рассчитанного с помощью ffmpeg (размер аудиофайла, содержащего первые n чанков, минус размер файла, содержащего первые n-1 чанков), а также длительности, рассчитанные по значениям e.timecode.
Похоже, проблема удушения - есть ли что-то подобное в Chrome? Как я могу исправить свой код, чтобы убедиться, что он не регулируется таким образом?
1 ответ
Это длинный пример, но попробуйте удалить любую обработку на уровне браузера, которая может быть выполнена для аудио, с такими ограничениями:
- echoCancellation ложь
- autoGainControl ложь
- noiseSuppression ложь