O que Vídeo Curto (Short-Form) faz?
Projete um vídeo 9:16 que sobrevive ao deslize. Vídeo curto não é um pequeno filme de lançamento — é uma máquina de retenção: um hook que conquista o primeiro segundo, interrupções de padrão que resetam a atenção a cada poucos segundos e, frequentemente, um loop que compra tempo de exibição além dos 100%. O ofício é o timing, não o polimento.
Quando usar
- Reels / TikTok / YouTube Shorts (7–60s, vertical 9:16).
- Edição de retenção: corrigir queda de audiência, adicionar interrupções de padrão, ajustar ritmo.
- Hooks, loops contínuos, templates de vídeo curto repetíveis (um design, muitos tópicos).
Estrutura da história (o contrato de retenção)
Contar histórias em vídeo curto é um contrato com o polegar do espectador: cada segundo deve reconquistar o próximo. A narrativa é moldada de trás para frente a partir da curva de retenção, não para frente a partir de uma introdução. Bloqueie estes pontos antes de tocar na linha do tempo.
- Uma ideia por vídeo. Um curto carrega exatamente um payoff. Uma segunda ideia divide a atenção e a curva cai no meio — transforme-a em um segundo vídeo. Se você não consegue nomear o único aprendizado em uma frase, você ainda não tem um curto.
- Abra um loop nos primeiros ~3s, feche-o por último. O hook coloca uma pergunta ou lacuna (o loop aberto); o payoff a responde. O espectador fica porque o loop está aberto — então nunca responda cedo demais, e nunca enterre o payoff em preparação.
- Sem ar morto. Cada batida avança a ideia ou reseta a atenção. Corte tudo que não faça nem um nem outro. Silêncio, rampas lentas, introduções de aquecimento ("ei pessoal, neste vídeo…") são onde os espectadores deslizam.
- Por que a curva, não o corte, é a unidade de trabalho. O algoritmo distribui o que mantém a curva de retenção por segundo plana; uma edição "boa" que achata a curva perde para uma feia que a mantém alta. Você está editando a curva, e o hook é a comporta de tudo que vem depois — corrija-o primeiro.
A espinha narrativa (o arco Hook → Setup → Corpo → Payoff/loop está orçado na tabela abaixo):
| Movimento | Função na história | Falha se perdido |
|---|---|---|
| Hook | Abrir o loop; prometer o payoff | Deslize nos primeiros 3s |
| Manutenção da tensão | Manter a lacuna aberta durante o corpo | Meio plano, queda no meio |
| Payoff | Fechar o loop — a única ideia, entregue | "Perdi meu tempo", sem compartilhamento |
| Loop / CTA | Alimentar de volta ao frame 0, ou um pedido claro | Sem repetição, sem ação |
(A tabela do arco de retenção abaixo atribui segundos a cada movimento; esta seção é a lógica narrativa e a ordenação por trás dela. A gramática do hook lista os arquétipos de hook.)
A única métrica que impulsiona tudo
Retenção, não valor de produção. O algoritmo distribui o que mantém os espectadores; ~87% decidem ficar ou deslizar em 3 segundos, e o limite para distribuição fica próximo de 70%+ de taxa de visualização média (Shorts ~73%, TikTok ~78%, Reels ~65%). Cada decisão abaixo é negociada contra essa curva. Um take impecável que entedia aos 0:04 perde para um feio que segura.
O arco de retenção
| Batida | Função | Orçamento (de um curto de 20s) |
|---|---|---|
| Hook (0–1s) | Um frame + uma linha que cria um loop aberto | 0–1s |
| Setup | Pagar por que assistir — promessa, stakes ou a lacuna | 1–4s |
| Corpo | Entregar valor em batidas; uma ideia por batida | 4–17s |
| Payoff / loop | Fechar o loop — ou realimentá-lo ao frame 0 | 17–20s |
Escale o corpo, nunca o hook. Um curto de 60s tem um corpo maior e mais batidas — o mesmo hook de 1 segundo.
Gramática do hook (primeiro ~1s)
O hook é uma frase + um visual que abre uma lacuna de curiosidade que o cérebro precisa fechar. Escolha um padrão e comprometa-se:
| Tipo de hook | Forma | Melhor para |
|---|---|---|
| Loop aberto | "O motivo pelo qual seu X continua Y…" (resposta atrasada) | a maioria dos conteúdos |
| Promessa direta | "3 maneiras de ___ em 30 segundos" | educacional / lista |
| Interrupção de padrão | snap-zoom / whip-pan / incompatibilidade visual no frame 1 | entretenimento |
| Negação | "Pare de fazer ___" / "Você está ___ errado" | opiniões fortes |
Duas regras: a linha do hook está na tela como texto até o frame 1 (85% assistem sem som), e o visual mais marcante também é o primeiro frame — nunca uma rampa lenta de entrada. Segure um frame de abertura forte; não faça fade up a partir do preto.
Interrupções de padrão e ritmo de corte
Uma interrupção de padrão é qualquer mudança que reseta a atenção: um corte seco, zoom punch, inserção de B-roll, efeito sonoro, pop de legenda ou mudança de ângulo. Em vídeo curto, a densidade é alta — uma mudança visual a cada ~2–4 segundos; vídeos com uma interrupção aproximadamente a cada 4s seguram ~58% contra ~41% para um cabeça falante estático. O assassino é um meio plano: o TikTok reduz a distribuição quando a curva de retenção achata, então nunca costure o corpo a partir de takes de baixa energia.
// Conduza cada interrupção a partir do FRAME, não do relógio — renderiza deterministicamente.
import { useCurrentFrame } from "remotion";
const fps = 30;
const cuts = [0, 1.2, 3.0, 5.4, 8.0, 11.2, 14.0]; // segundos — desiguais de propósito
const frame = useCurrentFrame();
const shot = cuts.findIndex((t, i) => frame < (cuts[i + 1] ?? Infinity) * fps);
Varie o intervalo — um metrônomo é lido como tédio; cortes desiguais são lidos como momentum. Um zoom punch-in é a interrupção mais barata que não precisa de novo material:
import { useCurrentFrame, interpolate, spring, useVideoConfig } from "remotion";
const PunchIn = ({ at, children }) => {
const frame = useCurrentFrame(); const { fps } = useVideoConfig();
const s = spring({ frame: frame - at * fps, fps, config: { damping: 12, stiffness: 200 } });
const scale = interpolate(s, [0, 1], [1, 1.12]); // snap para 112% na batida
return <div style={{ transform: `scale(${scale})`, transformOrigin: "50% 45%" }}>{children}</div>;
};
Legendas
A maioria dos espectadores assiste sem som, então legendas na tela não são opcionais — elas carregam o conteúdo e funcionam como uma interrupção de padrão quando cada frase aparece. Mantenha 4–7 palavras por linha, alto contraste, dentro da área segura. Não reimplemente animação de legenda aqui — use o skill caption-animation para timing palavra por palavra, destaque de karaokê e estilo; este skill apenas posiciona legendas na linha do tempo de retenção e dentro da zona segura 9:16.
Loops e repetição
Um loop contínuo conta cada repetição como tempo de exibição novo — um loop limpo de 8s assistido 3× é 300% de taxa de visualização, o sinal mais forte possível. Duas técnicas: combine o último frame com o primeiro (mesma composição, posição, cor) para que o corte seja invisível, e escreva um loop de frase — formule o hook para que o payoff alimente de volta ao frame 0 ("…e é por isso que eu nunca — " → loopa para o início). O melhor comprimento para repetição é ~7–15s.
Áreas seguras 9:16
Componha dentro da zona segura universal para que a UI da plataforma nunca cubra texto ou rostos.
| Zona | Pixels (1080×1920) | Evitar |
|---|---|---|
| Segura universal (todas as plataformas) | centro 900×1400 | qualquer coisa crítica fora dela |
| Topo | manter limpo ~120px | perfil / UI de som |
| Fundo | manter limpo ~320px | legendas, CTA, hashtags, barra de áudio |
| Direita | manter limpo ~120px | botões like / comentar / compartilhar |
Coloque o texto do hook e o sujeito principal na caixa central 900×1400. Reserve os ~320px inferiores mesmo que pareça vazio no editor — é onde a plataforma pinta suas próprias legendas e botões.
Checklist de saída
- A linha do hook está em texto na tela até o frame 1; o visual mais forte é o primeiro frame (sem fade-up).
- Um loop aberto / promessa definida nos primeiros ~4s.
- Uma interrupção visual de padrão a cada ~2–4s; intervalos desiguais; sem meio plano.
- Legendas presentes (via
caption-animation), 4–7 palavras, dentro da área segura. - Loop fechado — primeiro/último frame combinados ou uma frase que realimenta o frame 0.
- Composto dentro da caixa central 900×1400; fundo 320px / topo 120px / direita 120px mantidos limpos.
- Todo valor animado derivado de
useCurrentFrame()— sem timers CSS/biblioteca.
Entregar e verificar (stills renderizados → MP4)
Ajudante empacotado (
scripts/): mosaico de stills comscripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png, depois verifique a codificação comscripts/probe-mp4.sh out.mp4 [LxA] [fps]. Vejascripts/README.md.
O curto é enviado como uma composição Remotion (<Composition> + zod schema + defaultProps) — todo corte, punch-in e interrupção dirigido por useCurrentFrame(), nunca Date.now() / Math.random() / timers. Entregável = out/*.mp4 + o projeto (re-render por tópico). 9:16 vertical (1080×1920) é o padrão.
Loop de verificação — renderizar stills → inspecionar → codificar. Três frames testam as três coisas que fazem ou quebram a retenção: o hook, o ritmo e a costura do loop.
# Stills no hook / meio do corpo / último frame — COM PROPS ENVIADOS (o tópico real, não defaults)
npx remotion still Short out/f-hook.png --frame=10 --props='{"topic":"...","hook":"..."}' # ~primeiros 3s lidos instantaneamente
npx remotion still Short out/f-mid.png --frame=N --props='{"topic":"...","hook":"..."}'
npx remotion still Short out/f-end.png --frame=L --props='{"topic":"...","hook":"..."}' # L = durationInFrames-1
# Inspecione cada PNG:
# - Frame HOOK (~frame 0 / primeiros 3s): linha do hook está em texto na tela e lida instantaneamente; visual mais forte já presente (sem fade-up)
# - Costura do loop: compare f-hook(frame 0) vs f-end(último frame) — mesma composição/posição/cor para um corte de loop invisível
# - Área segura 9:16: hook + sujeito chave dentro da caixa central 900x1400; limpo do topo ~12%, fundo ~20-35% (legendas/CTA/áudio), trilha de ação direita
npx remotion render Short out/short.mp4 --props='{"topic":"...","hook":"..."}' # codificar uma vez que stills verificam
npx remotion render Short out/demo.gif --codec=gif # clipe de prova README
Por tópico / lote: verifique UM tópico via stills antes de renderizar todos eles. Use npx remotion compositions para durationInFrames/fps para escolher os frames do meio e do fim.
Antes de finalizar:
- Os stills renderizam limpos no hook, meio e último frame — sem erros.
- O frame do hook lê instantaneamente (texto na tela + visual mais forte na frente, sem fade-up); primeiro vs último frame combinam para uma costura de loop limpa.
- Hook + sujeito + legendas estão dentro da caixa segura central 9:16 900×1400 em cada frame verificado.
- Apenas frame-driven — sem
Date.now()/Math.random()/ timers; cortes desiguais, sem meio plano. - Props enviados de um tópico real (não
defaultProps) renderizam corretamente; MP4 codificado, GIF opcional.
Arquivos de referência
references/retention-pacing.md— uma composição Remotion<Short>completa e executável: um scheduler de cena frame-driven com cortes desiguais, a interrupção de padrão PunchIn, um hook na tela, uma sobreposição de área segura 9:16 e um loop contínuo primeiro/último frame. Além de uma biblioteca de padrões de hook, um método de depuração da curva de retenção, mapas de zona segura por plataforma e o padrão de renderização em lote template×tópico.