В Web Audio почему contextTime отстает от currentTime более, чем от baseLatency? - PullRequest
0 голосов
/ 31 декабря 2018

Насколько я понимаю, аудио-контекст имеет:

  • .currentTime, время в начале следующего кадрового буфера с возможностью выборки из 128 сэмплов (предыдущие буферы уже имелиотправлено)

  • .baseLatency, время, необходимое для передачи запланированного аудио из WebAudio land в ОС

  • .getOutputTimestamp().contextTime, aотметка времени для образца кадра, который в настоящее время передается в ОС

При этом понимании context.getOutputTimestamp().contextTime никогда не должно быть меньше context.currentTime - context.baseLatency.

Но это так!В моих тестах в Chrome на быстром MacBook это меньше, чем на -0,025 с.Это> 1000 образцов кадров позади.

const context = new AudioContext();

// Let the audio clock settle
setTimeout(function() {
    const currentTime = context.currentTime;
    const contextTime = context.getOutputTimestamp().contextTime;
    console.assert(
        contextTime > (currentTime - context.baseLatency),
        'contextTime', contextTime,
        'currentTime', currentTime,
        'baseLatency', context.baseLatency,
        'contextTime - (currentTime - baseLatency)', contextTime - (currentTime - context.baseLatency)
    );
}, 1000);

Мои предположения относительно того, что он должен делать, искажены, или API лжет мне о его baseLatency?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Мои предположения искажены.Спецификация Web Audio четко показывает это в примечаниях к разделу getOutputTimestamp (https://www.w3.org/TR/webaudio/#dom-audiocontext-getoutputtimestamp).

. Третий пункт в моем вопросе неверен. .getOutputTimestamp().contextTime - это , а не - отметка времени для образца кадрав настоящее время вручается звуковому драйверу, как я заявляю в вопросе. Это, как следует из названия, временная метка для образца кадра, который в данный момент выводится из звукового драйвера.

Как @Raymond намекает в своем ответе, правильная задержка для сравнения этой отметки времени с outputLatency (которая не реализована по состоянию на январь 2019 года).

0 голосов
/ 31 декабря 2018

.baseLatency - это, в основном, количество аудиосэмплов, необходимых для бесперебойной работы реализации WebAudio.Это может быть как минимум 128 (но не ниже) и может быть значительно больше (8000 или более).Для Mac по умолчанию установлено значение 256. Это используется для сглаживания любого дрожания звуковых часов.У Mac очень низкий джиттер, поэтому 256 (или 128) работают хорошо.Машины с Linux, как правило, не настолько точны, поэтому используется 512 или выше.(Для chrome.)

Сюда не входит дополнительная буферизация, которая может быть между webaudio и аудиосистемой браузера и браузером в ОС, а также из ОС на реальное устройство вывода.(Я понимаю, что устройства Bluetooth иногда могут иметь огромные задержки.)

Существует атрибут outputLatency, который должен это показывать, но, AFAIK, он еще не реализован ни в одном браузере.

...