Привет! Плавная прокрутка видео с помощью seek bar, особенно покадрово и без задержек, действительно может быть сложной задачей из-за: буферизации и декодирования видео, ограничений браузеров, производительности системы. Но ее можно реализовать довольно качественно, если учесть несколько моментов. Вот как можно добиться максимально плавной прокрутки:
Основные рекомендации:
1. Используй requestVideoFrameCallback
Это современный API, позволяющий отслеживать рендеринг кадров и синхронизировать UI.
video.requestVideoFrameCallback(function(now, metadata) {
// можно обновлять UI с точностью до кадра
});
2. Отключи автоматическое буферизование
Можно задать preload="none" и вручную загружать видео. Это даст тебе больше контроля, но увеличит время загрузки при первом воспроизведении.
3. Управляй currentTime вручную на input
Свяжи range input с video.currentTime.
Используй input (не change), чтобы получать плавные обновления при перемещении ползунка.
const video = document.getElementById('myVideo');
const slider = document.getElementById('slider');
slider.addEventListener('input', () => {
const duration = video.duration;
video.currentTime = (slider.value / 100) * duration;
});
4. Используй .pause() и избегай .play() при прокрутке
Не позволяй видео автоматически воспроизводиться — особенно при прокрутке назад/вперед. Это уменьшит лаги.
5. Формат видео — ключ
Лучше всего работает: видео без B-frames (только I и P кадры), высокая частота ключевых кадров (GOP ~1-2 сек), кодек: H.264 с хорошей поддержкой браузерами, низкое разрешение (если нет нужды в 4K).
Альтернатива:
Покадровая прокрутка через изображения
Если тебе нужно супер-точное управление — можно экспортировать кадры в PNG/JPEG и просто отображать нужное изображение при прокрутке.
Но это не масштабируется для больших видео.
Проблемы:
В некоторых браузерах (Safari, особенно на iOS) currentTime может с запозданием менять кадр.