Communitygithub.com

amrodwaire/phone-reel-edit

Guia de edição para transformar gravações de celular em Reels, Shorts ou TikToks verticais com texto em árabe na tela. Abrange verificação da fonte, corte, estabilização e câmera lenta com ffmpeg, correção de cor por números (LUT do ffmpeg ou DaVinci Resolve grátis), texto em árabe no Remotion com sobreposição automática, zona segura e verificação de contraste, corte de música para as edições, masterização de loudness para alto-falantes de celular e verificações antes da publicação. Use sempre que um vídeo vertical for cortado, recortado ou corrigido.

O que é phone-reel-edit?

Este skill automatiza o pipeline completo de edição de vídeos verticais para plataformas como Instagram Reels, YouTube Shorts e TikTok, com foco especial em texto em árabe na tela. Ele foi projetado para agentes de IA que precisam editar vídeos de celular de forma consistente e profissional, seguindo um fluxo de trabalho baseado em ffmpeg, DaVinci Resolve e Remotion. O skill inclui scripts Python para verificar a fonte do vídeo (resolução, taxa de quadros, HDR, áudio), estabilizar e aplicar câmera lenta, e corrigir cor usando medições numéricas de patches neutros e tons de pele. Para texto, ele usa um template Remotion com regras específicas para tipografia árabe: tamanhos grandes (62-124px), espaçamento de 1.5 entre linhas, e verificação automática de colisões e contraste com um script Python. Também gerencia a masterização de áudio para -14 LUFS com verificação de pico verdadeiro, e adapta a música para que soe bem em alto-falantes de celular (até 300 Hz). O fluxo de trabalho é orientado por regras de um Reel real que falhou em cada etapa primeiro, e inclui referências a documentos de pesquisa e casos especiais (HDR, 30 fps, fala na câmera). O skill suporta Revisão por segundo modelo de IA, mas sempre com verificação humana ou por ferramentas numéricas. Ele é executado em qualquer sistema com ffmpeg, Python, Node.js e (opcionalmente) DaVinci Resolve instalados.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/amrodwaire/phone-reel-edit/tree/HEAD

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

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

  1. 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.
  2. 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, em references/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.
  3. 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.md lista 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:

  1. 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.
  2. Nó Contrast. Contrast e Pivot, Lift para pretos profundos, um pequeno movimento de Sat de 5 ou menos.
  3. 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.
  4. 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 chroma antes 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, bt709 e a duração e contagem de quadros corretas.
  • check_text.py imprime PASS, com quadros --real incluídos.
  • master.sh imprimiu 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.

Habilidades Relacionadas