Подтвердить что ты не робот

Установка гранулярности звукового события 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... но хотел бы знать, есть ли способ сделать это.

4b9b3361

Ответ 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 аудиоэлемента. Но это возможность.

Я использую этот подход для элемента видео, но он также должен применяться здесь.