События в html video player?

Есть видео плеер на странице.

let video = document.getElementById('videoInsert');
video.ontimeupdate = ()=>{
    console.log(video.currentTime);
}
<video class="videoInsert" id="videoInsert" src="/video" controls></video>

Вывод в консоль:

0.108914
0.434117 
0.726041 
1.13307 
1.375844 
1.623902 
1.913049 
2.209517 
2.656656

Можно ли получать события от плеера с другим шагом дискретизации. Допустим, чтобы каждую миллисекунду происходил вывод в консоль?
Или назначить ожидание определённого времени?


Ответы (1 шт):

Автор решения: UModeL

Этот вопрос возникал ещё десять лет назад, но с тех пор мало что изменилось.

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

Согласно спецификациям, минимальный интервал обновления - 200-250 мс (4-5 Гц). Теоретически Вы можете вызывать currentTime с частотой вплоть до 1 мс, но так как все эти события асинхронны, то ответ Вы получите только тогда, когда браузер "переварит" и сочтёт нужным/возможным.

Опять же, если у Вас частота кадров (FPS) 100 Гц, то 1000 мс / 100 Гц = 10 мс. То есть желаемый интервал в 1 мс будет попросту избыточен, нагружая при этом вашу систему и не оставляя ресурсов для остальных операций (контроль интерфейса, рендеринг и, собственно, декодирование видео). Будут "тормоза", пропуски кадров и тому подобное.

И если с программным декодированием всё ясно - он явно "оттягивает" на себя значительную часть процессорного времени, то с аппаратным другая проблема - ограничение вызванное затратами на прием/передачу данных. Поэтому нужный интервал, даже при аппаратном ускорении, пока тоже недостижим.

Были попытки реализовать более точный поиск (в Firefox, например - seekToNextFrame()), но похоже, что отказались.

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

→ Ссылка