Diferente do vídeo no scroll (onde a rodinha do mouse dita a timeline), o vídeo tradicional possui seu próprio relógio interno (currentTime). Quando você aperta play, o tempo avança sozinho (0.1s, 0.2s, 0.3s…) e o hardware decodifica os quadros a 30 FPS até o fim.
O elemento <video> funciona como uma esteira rolante mecânica: play() liga o motor, pause() desliga e o currentTime salta diretamente para o ponto desejado na timeline. O navegador dispara eventos padronizados (loadstart, loadedmetadata, canplay, play, timeupdate, pause, ended) em cada fase da execução.
Poster e metadados (duração/tamanho) surgem primeiro.
O relógio interno currentTime começa a rodar sozinho.
O navegador prepara e pinta 30 quadros por segundo na tela.
Ao alcançar a duração máxima, dispara o evento ended.
<!--
Como o vídeo se comporta:
01. Carregar (Poster) -> 02. Reproduzir (Relógio) -> 03. Decodificar (GPU 30 FPS) -> 04. Terminar (ended)
-->
<!-- Player com controles customizados, barra de buffer e telemetria de eventos -->
<video id="meu-video" playsinline preload="metadata" poster="garden-poster.webp">
<source src="garden-motion.mp4" type="video/mp4">
<track kind="captions" src="garden-captions.vtt" srclang="pt" label="Português">
</video>
<script>
const video = document.getElementById('meu-video');
video.playbackRate = 1.5; // Velocidade 1.5x
</script>
preload="none"preload="metadata" (Padrão Ouro)preload="auto"<!-- 1. preload="none" : Não baixa nada até clicar no play (ideal para páginas com muitos vídeos) -->
<video controls playsinline preload="none" poster="poster.webp">
<source src="video.mp4" type="video/mp4">
</video>
<!-- 2. preload="metadata" : Baixa só dimensões e tempo (RECOMENDADO para quase todos os casos) -->
<video controls playsinline preload="metadata" poster="poster.webp">
<source src="video.mp4" type="video/mp4">
</video>
<!-- 3. preload="auto" : Permite ao navegador adiantar os primeiros segundos se a rede permitir -->
<video controls playsinline preload="auto" poster="poster.webp">
<source src="video.mp4" type="video/mp4">
</video>
<!-- Vídeo de fundo com reprodução contínua automática sem som -->
<video autoplay loop muted playsinline preload="metadata" poster="garden-mobile-poster.webp" style="width:100%; height:100%; object-fit:cover;">
<source src="garden-mobile.mp4" type="video/mp4">
</video>
const video = document.getElementById('meu-video');
// 1. Play & Pause
video.play();
video.pause();
// 2. Velocidade de reprodução (0.5x, 1x, 1.5x, 2x)
video.playbackRate = 1.5;
// 3. Pular para 2 segundos da timeline
video.currentTime = 2.0;
// 4. Escuta de eventos essenciais
video.addEventListener('timeupdate', () => {
console.log('Tempo atual:', video.currentTime, 'de', video.duration);
});
video.addEventListener('ended', () => {
console.log('O vídeo terminou!');
});
controlspreload="none|metadata|auto"playsinlineposter="imagem.webp"mutedlooppreload="none"preload="metadata"preload="auto"play / pausetimeupdateseeking / seekedendedvideo.play() / video.pause()video.currentTime = segundosvideo.playbackRate = 1.5video.buffered.end(0)muted é estritamente obrigatório.playsinline em vídeos inline para evitar que o iOS abra o player em tela cheia forçada ao tocar no play.