Установка гранулярности звукового события HTML5 'timeupdate'
Я пытаюсь создать простую функцию циклирования с использованием аудио HTML5 и имеет очень примитивное решение следующим образом:
$(audio).bind('timeupdate', function() {
if (audio.currentTime >= 26){
var blah = audio.currentTime;
audio.currentTime = 23;
console.log(blah);
}
})
Это работает отлично, но единственный глюк здесь заключается в том, что событие timeupdate не запускается очень последовательно. Например, вернул console.log:
+26,14031982421875
+26,229642868041992
+26,13462257385254
+26,21796226501465
... и т.д.. (Вы получаете идею... постоянное время)
Очевидно, что это не сработает для приложения, где важно время (музыкальные приложения). Поэтому очевидным решением для меня было бы увеличить степень детализации, с которой запускается событие timeupdate. Я не смог найти какие-либо документы API... но хотел бы знать, есть ли способ сделать это.
Ответы
Ответ 1
Извините, но так оно и работает. Из спецификаций html5:
Каждые 15 - 250 мс, или когда изменяется положение медиаплеера MediaController, в зависимости от того, что происходит наименее часто, пользовательский агент должен поставить в очередь задачу для запуска простого события с именем timeupdate в MediaController.
Кроме того,
Событие, таким образом, не должно срабатывать быстрее, чем около 66 Гц или медленнее 4 Гц (при условии, что обработчики событий не занимают больше 250 мс для запуска). Пользовательским агентам рекомендуется изменять частоту события на основе нагрузки на систему и среднюю стоимость обработки события каждый раз, так что обновления пользовательского интерфейса не являются более частыми, чем пользовательский агент может с комфортом обрабатывать при декодировании видео.
Если вы прочитаете спецификацию, вы можете понять, что событие timeupdate
является чем-то вроде события "наилучшего действия". Он срабатывает, когда он может и всегда, пока он не слишком сильно влияет на производительность.
Вы можете фильтровать события, отменяющие время от времени, чтобы сгладить время прибытия, но я боюсь, что невозможно сделать обратное.
Ответ 2
Следует отметить, что вы можете чаще читать свойство currentTime видео. Если время действительно критично, и вы можете жить с некоторой неопределенностью, вы можете попробовать это вместо этого.
Это, однако, намного менее элегантно, чем использование собственного тега timeupdate
.
setInterval(function () {
console.log(audio.currentTime); // will get you a lot more updates.
}, 30);
В этом случае вам придется самостоятельно управлять интервалом, убедитесь, что вы очистили его до null
аудиоэлемента. Но это возможность.
Я использую этот подход для элемента видео, но он также должен применяться здесь.