Я записываю речь с помощью 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 ложь
Другие вопросы по тегам