2015-02-10 2 views
0

Я использую 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/

Любая помощь будет принята с благодарностью. Благодаря!

+0

Обновлен мой пример кода рабочей версией. Однако было бы лучше добавить это как функцию Recorder.js –

ответ

1

Я немного смущен вашей заботой о латентности. Да, это правда, что возможная латентность может быть связана с длиной буфера, но есть много других задержек. В любом случае, латентность не имеет ничего общего с продолжительностью записи, которая, как мне кажется, относится к вашему вопросу.

Если вы хотите записать ровно 3-секундный буфер на 44100, то есть 44100 * 3 = 132 300 образцов. Размер буфера составляет 4096 выборок, и система будет записывать даже кратное этому номеру. Учитывая, что наиболее близким вам нужно будет записать 32 или 33 полных буфера. Это дает либо образцы 131072 (2,97 секунды), либо 135168 (3 065 секунд).

У вас есть пара вариантов здесь.

  • Выберите длину буфера, которая равномерно делит частоту дискретизации.например 11025. Затем вы можете записать ровно 12 буферов.
  • Запишите немного больше, чем нужно за 3,0 секунды, а затем выбросьте дополнительные 2868 образцов.
+0

Если я попытаюсь использовать собственный размер буфера, он даст ошибку «Непознан IndexSizeError: не удалось выполнить« createScriptProcessor »в« AudioContext »: размер буфера (4410) должен быть силой двух между 256 и 16384. " собираюсь попробовать второе предложение сейчас! –

+0

Хорошо, что сработало. Обновите мой пример кода здесь: http://kmturley.github.io/Recorderjs/, однако я думаю, что более эффективно добавлять это как вариант в Recorder.js, чем делать это извне. Я попытался добавить метод setLength для установки длины записи, но это вызывает ошибки :( –

+0

Получил эту работу с новым параметром Recorder.js под названием maxLength: https://github.com/kmturley/Recorderjs. Я отправил запрос на перенос владелец библиотеки тоже. Спасибо за вашу помощь! –

Смежные вопросы