SWCore / Animações / Vídeo tradicional

Vídeo tradicional Animações

O elemento

O que é

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.

Como funciona

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.

Exemplos

00 · O Pipeline dos 4 Estados (Modelo Mental) Ao vivo
01
Carregar

Poster e metadados (duração/tamanho) surgem primeiro.

02
Reproduzir

O relógio interno currentTime começa a rodar sozinho.

03
Decodificar

O navegador prepara e pinta 30 quadros por segundo na tela.

04
Terminar

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)
-->
01 · Player MP4 Real Interativo (Controles, Buffer e Telemetria) Ao vivo
00:00.0 / 00:03.8
Velocidade:
EVENTOS DO VÍDEO (DISPARADOS AO VIVO):
loadedmetadata canplay play timeupdate pause seeking 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>
02 · Os 3 Modos de Pré-carregamento (preload) Ao vivo
preload="none"
Zero consumo de rede inicial: Não faz download de nenhum byte até o usuário clicar em Play. Perfeito para listas, blogs ou galerias com dezenas de vídeos.
preload="metadata" (Padrão Ouro)
Equilíbrio Ideal: O navegador baixa apenas a duração e a proporção do vídeo. A página não quebra o layout e não consome dados desnecessários na rede 4G/5G.
preload="auto"
Antecipação Completa: O navegador tenta baixar e deixar em buffer os primeiros segundos do vídeo antes do clique (útil apenas quando o vídeo é o elemento principal da página).
<!-- 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>
03 · Vídeo de Fundo Silencioso (Background Loop) Ao vivo
VÍDEO DE FUNDO AUTOPLAY + MUTED
<!-- 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>
04 · Controle Programático via JavaScript (Snippet) Referência
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!');
});

Atributos

controls
ativa os controles nativos do navegador como fallback imediato
preload="none|metadata|auto"
estratégia de pré-carregamento dos dados na rede
playsinline
obrigatório no iOS/Safari para não forçar tela cheia
poster="imagem.webp"
imagem estática exibida antes do play (evita tela preta e layout shift)
muted
vídeo sem som (obrigatório se quiser autoplay)
loop
reinicia automaticamente ao chegar ao fim

Variantes

preload="none"
Economia máxima: não baixa nenhum byte do vídeo até o usuário clicar
preload="metadata"
Equilíbrio perfeito: baixa duração, proporção e dimensões sem baixar o arquivo inteiro
preload="auto"
Antecipação: permite ao navegador baixar partes do vídeo antecipadamente

Eventos

play / pause
disparado quando o vídeo começa ou interrompe a reprodução
timeupdate
disparado continuamente enquanto o relógio de mídia avança
seeking / seeked
disparado quando o usuário arrasta a barra da timeline
ended
disparado quando o vídeo atinge o último milissegundo de reprodução

API (JavaScript)

video.play() / video.pause()
inicia ou pausa a reprodução
video.currentTime = segundos
salta para um ponto específico da timeline
video.playbackRate = 1.5
ajusta a velocidade (ex: 0.5x, 1.0x, 1.5x, 2.0x)
video.buffered.end(0)
retorna até qual segundo o vídeo já está em cache na memória

Requisitos

  • O arquivo deve ser codificado em MP4 (H.264 / AAC) para compatibilidade universal em 100% dos navegadores desktop e mobile.

Limitações — o que ele não faz

  • No iOS e Safari Mobile, vídeos com áudio nunca iniciam em autoplay — para rodar sozinho, o atributo muted é estritamente obrigatório.
  • Sempre use playsinline em vídeos inline para evitar que o iOS abra o player em tela cheia forçada ao tocar no play.