2016-12-23 6 views
1

При нажатии звука в веб-аудио api вы можете установить время, когда звук начнется с source.start(startTime);. Однако мне интересно, насколько это точно. Я знаю, что setTimeout() просто введите код, который будет выполнен в очереди событий. Я предполагаю, что это то, что делает веб-аудио api, но это только предположение. Таким образом, между ними не было бы никакой разницы.Является ли веб-аудио api более точным, чем setTimeout

Я попытался запустить какой-то длительный процесс перед воспроизведением звука, и звук действительно задерживается.

//... 
    source.start(startTime + 0.2); 
    //.... 
let i = 0; 
while(i < 100000){ 
    console.log("p" + i); 
    i++; 
} 

Так что делает звук апи веб использует setTimeout под капотом. Если бы я мог сделать что-то более отзывчивым, используя веб-рабочего? Я знаю, что у веб-рабочего есть доступ к setTimeout, но я не уверен, что он может получить доступ к веб-аудио api.

Из док:

Аудио работники обеспечивают возможность прямого сценария обработки звука быть сделано в контексте веб-работника, и определяются парой интерфейсов (новый по состоянию на 29 августа 2014 .) Они не реализованы в любых браузерах еще

Это только адреса точки обработки звука, я не уверен, что включает в себя только играть аудио.

ответ

4

Является ли веб-аудио api более точным, чем setTimeout?

Да, безусловно! Звуковой таймер implementation стремится уменьшить (накопительную) задержку и предоставить возможности синхронизации в реальном времени и точности вплоть до уровня выборки. Он использует прецизионный планировщик для аудио-событий.

От MDN:

синхронизации контролируется с высокой точностью и низкой задержкой, что позволяет разработчикам писать код, который реагирует точно к событиям и является в состоянии ориентироваться на конкретные образцы, даже при высокой частоте дискретизации. Таким образом, приложения, такие как драм-машины и секвенсоры, находятся в пределах .

и от the W3C Editor's Draft 20 December 2016:

[...] В частности, вместо того, чтобы использовать очереди сообщений, реализаторы могут использовать память, которая совместно используется между потоками, до тех пор, как память операции не являются заказана.

Пути setTimeout() работа не является достаточно точной для обработки звука в целом и ее значения времени нижнего конца даже может быть ограничена (например, установив его на 1мс может быть изменено на 4 мс в браузере). Он может срабатывать или не срабатывать в указанное время, в зависимости от очереди событий, а также других факторов.

Другое, что нужно иметь в виду, что все запланированные времена в API веб-аудио относятся к значению AudioContext's currentTime (ibid).

Так что веб-аудио api использует setTimeout под капотом?

Вроде уже не ответили, но нет, абсолютно нет :)

Audio Рабочих узлов будут использоваться для обработки звуковых данных (например, текущих, но осуждаются ScriptProcessorNode), но в отдельных потоках, а не для воспроизведения звука самих себя. Все воспроизведение звука происходит через основную аудиопотоку. См. Больше на Audio Workers Nodes here.

+1

Благодарим за подробный ответ, это было полезно. Я не уверен, что я вижу использование аудиоработников, или, может быть, я точно это сделаю. Например, в тот момент, когда я хочу остановить звуки с эффектом «release» (звук постепенно становится ниже), я использую 'setTimeout'. Если бы у меня был веб-рабочий, я бы мог сделать это в аудиоработнике вместо основного потока и быть более точным. Это неважно, потому что это нечто прогрессивное, но мне было бы хорошо. Надеюсь, это скоро будет реализовано. Еще раз спасибо. – Ced