Edição de Reel para celular
A maioria das regras aqui vem de um Reel real que falhou exatamente naquela etapa primeiro. references/research.md contém as razões e fontes. references/resolve-ui.md mapeia os controles do DaVinci Resolve para uso com computer use.
Alguns casos ainda não passaram por um Reel publicado: fontes HDR, câmera lenta a 30 fps, fala na câmera, áreas seguras do TikTok e Shorts, e capas. Seus comandos foram executados apenas em clipes de teste. references/other-cases.md os contém e explica como cada um foi verificado. Avise o usuário quando uma edição depender de um deles.
Pipeline: fonte do celular, corte e estabilização com ffmpeg, cor (DaVinci Resolve ou scripts/grade.py para movimentos de quadro inteiro), texto no Remotion, som e masterização com ffmpeg.
Antes de cortar
- Leia as regras da marca para o cliente, se houver: palavras proibidas, linha de contato, rotulagem de IA e o que precisa de aprovação antes de publicar.
- Verifique cada clipe fonte:
python -I scripts/probe_source.py clip.mp4. Ele informa rotação, taxa de quadros e se varia, SDR ou HDR, tags de cor e áudio, e então lista o que o clipe precisa antes de cortar. Clipes típicos de celular são SDR bt709 a cerca de 30 ou 60 fps. Fontes HDR, com taxa de quadros variável e a 30 fps precisam de uma etapa extra, emreferences/other-cases.md. Conversa ao fundo significa que o som original permanece mudo. Se a pessoa na câmera está falando com o espectador, veja a seção de fala do mesmo arquivo. - Se você usar um segundo modelo de IA como revisor, discuta a ideia com ele antes de decidir e depois verifique o que ele diz.
references/research.mdlista os tipos de erros que um modelo revisor cometeu.
Ritmo
- Uma ideia por Reel. O texto define a duração, não um número alvo. Um Reel de teste precisou de 18,6 s porque o cliente não conseguia terminar de ler em 10,5 s ou 13,5 s.
- Reserve 10 caracteres árabes por segundo, contados a partir do momento em que uma linha aparece. Isso é lento de propósito: o espectador também está assistindo à imagem em um celular.
- Duas revelações por take quando possível, e pelo menos 1,5 s entre elas. Linhas que aparecem juntas contam como uma revelação.
- A opinião de um leitor nativo sobre o ritmo supera a de qualquer modelo.
- A imagem visual mais forte e o texto de gancho estão na tela no quadro 0, sem fade do preto.
- Evite uma aceleração repentina de 3x. Suavize gradualmente durante um momento ruim.
60 fps reproduzido a 0,5x fornece quadros reais a 30 fps, portanto, nenhuma interpolação é necessária. Uma fonte de 30 fps não tem quadros extras, então leia a seção de câmera lenta de references/other-cases.md antes de desacelerar uma. Estabilize para um intermediário de 60 fps e depois reajuste o tempo:
ffmpeg -ss S -t D -i raw.mp4 -vf "vidstabdetect=shakiness=6:accuracy=15:result=x.trf" -f null -
ffmpeg -ss S -t D -i raw.mp4 -vf "vidstabtransform=input=x.trf:smoothing=14:zoom=2:optzoom=0:interpol=bicubic,crop=W:H:X:Y,scale=1080:1920:flags=lanczos,fps=60" -an -c:v libx264 -preset veryfast -crf 10 -pix_fmt yuv420p im.mp4
python -I scripts/retime.py im.mp4 c1.mp4 --start 0.4 --frames 99 --keys 0:.5
Execute os caminhos scripts/ a partir da pasta deste skill. O ffmpeg precisa dos filtros vidstab. Cada clipe deve começar no tempo zero, porque um início diferente de zero aparece como quadros pretos no início no Resolve. Adicione setpts=PTS-STARTPTS ao usar -ss com um filtro de tempo e verifique start_time com ffprobe.
Uma mão que invade os últimos quadros de um take parado pode ser ocultada mantendo um quadro anterior: trim=end_frame=N,setpts=PTS-STARTPTS,tpad=stop_mode=clone:stop_duration=0.6.
Cor
Cor aqui significa correção: brancos neutros, pele natural, cores verdadeiras do produto, combinando takes. Um look criativo vem por último e permanece sutil, e as cores do produto ainda devem ser medidas com precisão depois dele.
Escolha a rota pelo que o take precisa:
- Apenas movimentos de quadro inteiro (matiz, exposição, contraste, saturação):
scripts/grade.py. É mais rápido e repetível, e os números permanecem em um comando que você pode reexecutar. - Uma parte do quadro precisa de sua própria correção (pele sob luz diferente, um objeto): DaVinci Resolve, por suas Power Windows.
Ambas as rotas usam o mesmo loop de medir, ajustar, medir e os mesmos alvos abaixo.
Com grade.py
python -I scripts/grade.py still c1.mp4 1.5 before.png
python -I scripts/measure_grade.py before.png --patch counter:40,60,200,220 --skin 100,1450,1000,1920
python -I scripts/grade.py make c1.cube --frame before.png --neutral 40,60,200,220 --white 205 --contrast 1.06 --pivot 0.4 --lift -0.02
python -I scripts/grade.py still c1.mp4 1.5 check.png --lut c1.cube --compare
python -I scripts/grade.py apply c1.mp4 c1g.mp4 --lut c1.cube
--neutral é uma área que deve ser cinza ou branca: um balcão, uma parede, papel, uma tampa branca. make equaliza seus canais R, G e B, e --white define o nível final. Escolha uma área que seja uniformemente iluminada e não estourada. Observe o quadro --compare em tamanho real e meça a metade corrigida, antes de aplicar. Uma LUT por take, porque cada take tem sua própria dominante de cor.
Adicione --knee 0.85 quando um ganho empurrar os realces acima de 250. Use --denoise light apenas em clipes com pouca luz visivelmente ruidosos e --sharpen raramente: os celulares já nitidam, e mais dá halos nas bordas e no texto.
Uma correção feita no Resolve pode sair como LUT: clique com o botão direito na miniatura do clipe na página Color, Generate LUT, 33 Point Cube. grade.py apply --lut então a aplica em qualquer clipe. Uma LUT contém apenas movimentos de quadro inteiro, portanto, as janelas não estão nela.
No DaVinci Resolve grátis
Copie os clipes para uma pasta simples que o Resolve possa ver (ele não consegue abrir algumas pastas de dados do aplicativo e diz "Path does not exist"). Coloque-os em uma nova timeline e abra o escopo Parade.
Trabalhe nesta ordem, porque cada etapa depende da anterior:
- Nó Balance. Gain para o nível de branco, Temp para a dominante. Temp positivo aquece. A mesma superfície em dois takes deve corresponder.
- Nó Contrast. Contrast e Pivot, Lift para pretos profundos, um pequeno movimento de Sat de 5 ou menos.
- Nó Subject, apenas quando um movimento global prejudicar outra coisa. Use uma Power Window suave. No Reel de teste, uma janela corrigiu a pele de uma mão e deixou as cores do produto intocadas.
- Renderize, meça, ajuste e repita. Duas passagens foram suficientes.
python -I scripts/measure_grade.py frame.png --patch counter:40,60,200,220 --skin 100,1450,1000,1920
Alvos
- Superfícies neutras: R, G e B dentro de cerca de 3 a 5. Branco por volta de 195 a 215 para um look brilhante.
- Matiz da pele perto de 123 graus. Mantenha natural, porque a linha do vectorscope é uma referência, não um alvo.
- Brilho da pele: guias o colocam entre 40% e 70% dependendo da pele e da cena. Use essa faixa para detectar um erro, não como um número a acertar.
- Realces abaixo de cerca de 2% dos pixels com 250+.
- Saturação: compare a linha
chromaantes e depois. Uma correção deve deixar o p95 próximo de onde estava. Um grande salto significa que a correção está adicionando cor que a cena não tinha. - As cores do produto permanecem verdadeiras quando o vídeo vende um produto.
- Dois takes da mesma superfície medem o mesmo.
O que move o quê:
- Tint mal moveu uma palma vermelha. Gamma por canal corrigiu: G para cima, R e B para baixo um pouco.
- Temp +300 exagerou uma dominante azul onde +130 era o correto. Comece pequeno.
Texto em árabe no Remotion
assets/reelTemplate.tsx é um template funcional. Ele mantém cada bloco de texto como dados e tem uma composição de sonda para a verificação de texto. references/remotion-setup.md cobre como iniciar um projeto do zero e registrar as composições.
Regras:
- Uma fonte árabe pesada (o template usa Alexandria 800), branco mais uma cor de destaque, sem caixas, uma sombra suave.
- Tamanhos 62 a 124 px em um quadro 1080x1920. Um celular precisa deles tão grandes.
- Espaçamento de linha 1,5 para árabe. Em 1,22 as caudas das letras tocam a linha seguinte.
- Cada letra dentro de x 110-950 e y 220-1475, para que a barra lateral direita e a barra inferior do Instagram não cubram nada.
whiteSpace: nowrap, para que uma linha nunca quebre por surpresa.- Gancho no quadro 0. Linhas posteriores cerca de 1 s de distância, com uma subida e fade de 6 quadros.
- Uma faixa escura suave atrás do texto mantém o assunto visível abaixo dele.
- Citações de clientes permanecem palavra por palavra, sem nome ou foto, a menos que o cliente tenha concordado.
- Diga o que o espectador está vendo. Não deixe um rótulo implicar que é a única opção.
Após qualquer alteração de texto, renderize os quadros de sonda e verifique-os:
npx remotion still ReelProbe out/p0.png --frame=0
python -I scripts/check_text.py out/p0.png out/p1.png out/p2.png out/p3.png
Ele falha quando a tinta de duas linhas fica a menos de 14 px ou uma letra sai da área segura. Um bloco contém no máximo sete linhas.
Em seguida, verifique o texto contra a imagem real. Renderize o último quadro de cada take, quando todas as linhas estão na tela, e passe esses quadros na mesma ordem:
npx remotion still Reel out/r0.png --frame=119
python -I scripts/check_text.py out/p0.png out/p1.png --real out/r0.png out/r1.png
Cada linha recebe um valor de contraste contra a parte mais brilhante da imagem ao redor de suas letras, e abaixo de 3,0 falha. No Reel de teste, as linhas com cor de destaque marcaram 3,2 a 4,6 e as linhas brancas 5 ou mais. Uma pontuação baixa significa uma faixa mais forte atrás do texto ou mover o bloco.
A caixa padrão é a do Instagram. Para um Reel que também vai para o TikTok ou Shorts, adicione --platform all. Essas duas caixas vêm de guias de terceiros, portanto, pré-visualize o upload em cada aplicativo.
Em seguida, observe os quadros em tamanho real no final de cada take. Uma folha de miniaturas esconde colisões, e coisas que se movem atrás do texto só aparecem em tamanho real. No Reel de teste, uma colher cruzou uma linha. Um pequeno zoom com uma origem de canto a moveu para fora e também cortou um dedo perdido.
Renderizar e som
npx remotion render Reel out/reel.mp4 --codec=h264 --crf=15 --muted --color-space=bt709
python -I scripts/beat_offset.py music.ogg --cuts 3.3,6.5,10.3 --length 13.5 --from 0 --to 40
--color-space=bt709 é importante. Sem ele, o Remotion escreve full-range bt470bg com primárias desconhecidas.
Corte a música do melhor offset, fade os últimos 1,2 s, junte com -c:v copy, depois masterize:
sh scripts/master.sh in.mov out.mp4 -14 0.4 0.75
O último número é o teto do limiter. AAC adiciona overshoot acima dele, e a quantidade depende da faixa, então o script mede o arquivo que escreveu e imprime seu loudness e pico verdadeiro. Se imprimir TOO HOT (pico verdadeiro acima de -1 dBTP), execute novamente com 0,7.
Alto-falantes de celular perdem a maior parte do som abaixo de 300 Hz, então verifique essa banda:
ffmpeg -hide_banner -nostats -i out.mp4 -vn -af "highpass=f=300:poles=2,highpass=f=300:poles=2,lowpass=f=12000,ebur128" -f null - 2>&1 | tail -12
Mire em -20 LUFS ou mais alto nessa banda em um master de -14 LUFS. Uma faixa com muitos graves mediu -23,9 e soou abafada em celulares. Desenhe a forma de onda e o espectro também, porque os timestamps de um modelo revisor nem sempre correspondem a eles.
Música ou voz gerada por IA precisa do rótulo de IA da plataforma. Gere música ligeiramente mais longa que o Reel, porque uma faixa cortada curta não pode ser estendida de forma limpa.
Verificações antes de chamar de pronto
- ffprobe mostra
yuv420p, tv, bt709, bt709, bt709e a duração e contagem de quadros corretas. check_text.pyimprime PASS, com quadros--realincluídos.master.shimprimiu um pico verdadeiro em ou abaixo de -1 dBTP.- Um quadro de capa existe se o Reel aparecer em uma grade de perfil (
references/other-cases.md). - Olhe para os quadros em tamanho real você mesmo, incluindo o primeiro e o último quadro e o quadro antes de cada corte.
- Se um modelo revisor assistir ao mp4 final, forneça a ele as decisões já tomadas para que ele não as reabra.
- Informe o que não foi verificado. Um agente não pode ouvir o áudio ou ver o arquivo em um celular.
- Depois de substituir um arquivo que já foi enviado para algum lugar, faça o upload novamente, verifique-o a partir do link público e atualize qualquer coisa agendada que aponte para o arquivo antigo.
Publicar precisa da aprovação do cliente.