У меня проблема с MediaRecorder API (https://www.w3.org/TR/mediastream-recording/#mediarecorder-api).
. Я использую его для записи речи с веб-страницы с помощью 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.
Похоже, возникла проблема с дросселированием.что-то подобное в хроме?Как я могу исправить свой код, чтобы убедиться, что он не регулируется таким образом?