Я использую Recorder.js для записи звука из настольных и мобильных браузеров Google Chrome. В моем конкретном случае использования мне нужно записать ровно 3 секунды аудио, начиная и заканчивая в определенное время.Recorder.js вычисляет и компенсирует запись для латентности
Теперь я знаю, что при записи звука ваша звуковая карта не может работать в реальном времени из-за аппаратных задержек, поэтому всегда есть буфер памяти, который позволяет вам вести запись без скачков звука/заикания.
Recorder.js позволяет настраивать переменную bufferLen именно для этого, в то время как sampleRate берется автоматически из объекта аудиоконтекста. Вот упрощенная версия о том, как это работает:
var context = new AudioContext();
var recorder;
navigator.getUserMedia({audio: true}, function(stream) {
recorder = new Recorder(context.createMediaStreamSource(stream), {
bufferLen: 4096
});
});
function recordLoop() {
recorder.record();
window.setTimeout(function() {
recorder.stop();
}, 3000);
}
Проблема я столкнулся не в том, что запись() не компенсирует для буфера задержки и ни делает остановки(). Поэтому вместо того, чтобы получить звук в течение трех секунд, это 2,97 секунды, и начало отключено.
Это означает, что мои записи не запускаются в одном и том же месте, а также когда я их зацикливаю, петли различной длины в зависимости от задержки вашего устройства!
Есть два потенциально решения я вижу здесь:
- Adjust Recorder.js код для автоматического смещения буфера против вашего старт/стоп раза (возможно добавить новые функции startSync/stopSync)
- Вычислить задержку и создайте два таймера смещения, чтобы запустить и остановить Recorder.js в правильные моменты времени.
Пытаюсь раствор 2, потому что решение 1 требует знания буферных массивов, которые я не имею :(Я считаю, что расчет задержки является:
var bufferSize = 4096;
var sampleRate = 44100
var latency = (bufferSize/sampleRate) * 2; // 0.18575963718820862 secs
Однако, когда я бегу эти расчеты в реальном тесте я получаю:
var duration = 2.972154195011338 secs
var latency = 0.18575963718820862 secs
var total = duration + latency // 3.1579138321995464 secs
что-то не так, это не делает 3 секунды, и это начинает путать меня теперь я создал рабочую вилку Recorder.js демо с бревном :
http://kmturley.github.io/Recorderjs/
Любая помощь будет принята с благодарностью. Благодаря!
Обновлен мой пример кода рабочей версией. Однако было бы лучше добавить это как функцию Recorder.js –