Demo video
Uma demonstração de produto, uma prévia para loja ou um loop de funcionalidade construído a partir da gravação de tela REAL do usuário. A interface nunca é regenerada: a gravação é cortada, acelerada, ampliada, emoldurada, legendada e narrada. A Apple estabelece a mesma regra para prévias (2.3.4: capturas de tela em vídeo do próprio aplicativo, narração e sobreposições permitidas). Um único cut.json armazena as gravações, as cenas ordenadas e as variantes; democut.py as transforma em arquivos com ffmpeg local, e o recorte é gratuito.
Etapa 0 — Verificação prévia
Uma vez por sessão:
python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" tools
kind: "ffmpeg_missing"→ não é possível fazer o corte localmente. Informe e ofereça a rota paga do utilitário emreferences/routing-utility.md, ou peça ao usuário para instalar o ffmpeg. Nunca improvise com outras ferramentas.- Mantenha
can.burn_captions(libass),can.duck(sidechaincompress),can.webm. Os que faltam alteram o que você promete, nunca o que você afirma. - Somente quando algo será gerado (narração, música, som, dublagem, uma placa):
command -v genmedia python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflightblockersnão vazio, CLI ausente ou mais antigo que 0.7.0 →/genmedia-skills:setup. Chave ausente → o usuário executagenmedia setupou exportaFAL_KEYpor conta própria; aguarde. Nunca leia, imprima, solicite ou digite uma chave. Mantenhaconfig.announce_above_usdeconfig.confirm_above_usd(padrões 0.50 e 2). - Retome primeiro:
.genmedia/projects/<slug>/demo-video/cut.jsonexiste → continue a partir dele, nunca inicie um segundo corte para o mesmo produto.
Regras de UX
- Responda no idioma do usuário. A narração, as linhas
saye o texto na tela permanecem no idioma em que são enviados; os prompts dos modelos são em inglês. Caminhos, IDs e nomes de campos permanecem como estão. - Sem JSON, gráficos de filtro, IDs de requisição ou narração de ferramentas no chat. No máximo uma linha de status por etapa longa.
- Orçamento de perguntas: 2, uma de cada vez, opções rotuladas, somente quando a resposta estiver faltando:
- P1 a gravação, quando nenhum arquivo foi fornecido: peça os caminhos e forneça a pequena lista de captura de
references/recording-tips.md. Não há padrão para filmagem. - P2 para onde vai, quando a solicitação não diz: A demonstração para site (16:9) · B Prévia da App Store · C Vídeo de cabeçalho ou resultados de pesquisa da App Store · D Promo do Google Play · E Vídeo de lançamento do Product Hunt · F um loop ou GIF silencioso. Vários podem ser escolhidos; um corte atende a todos. Todo o resto é um padrão que você declara na entrega: 60 s para uma demonstração, 20 s para uma prévia de loja, 12 s para um cabeçalho ou vídeo de pesquisa da App Store, 6 s para um loop; narração ativada para uma demonstração, desativada para um loop ou um cabeçalho ou vídeo de pesquisa; música desativada a menos que solicitada; legendas como arquivo adicional; cortes, sem dissoluções; sem moldura de dispositivo a menos que um destino de loja ou rede social exija uma.
- P1 a gravação, quando nenhum arquivo foi fornecido: peça os caminhos e forneça a pequena lista de captura de
- O cartão de corte é uma parada obrigatória. Mostre a lista de cenas (horários, o que acontece, o que é dito, durações) e aguarde um "sim" antes que qualquer coisa seja gerada ou renderizada. Silêncio não é aprovação, e um sim para uma versão anterior não é um sim para esta.
- Narração antes da imagem. Gere a voz por cena, deixe
timemedi-la, e corte a imagem para ela. Nunca cronometre uma cena adivinhando quanto tempo uma frase leva (references/narration-and-audio.md). - Olhe antes de entregar. Leia o quadro de pôster e uma folha de contato do arquivo finalizado, e leia o primeiro quadro de qualquer GIF. Uma demonstração que valida mas mostra a tela errada ainda está errada.
- Fatos e privacidade vêm do usuário. Avaliações, contagens, prêmios, nomes de clientes e logotipos aparecem apenas quando o usuário os forneceu. Se um quadro mostrar dados reais, a solução é uma nova gravação, não um desfoque; diga isso claramente.
- Custo: o corte, os quadros, os loops e cada verificação custam USD 0. Antes de qualquer geração, estime e aplique a barreira da verificação prévia: abaixo de
announce_above_usd→ execute e informe; atéconfirm_above_usd→ uma linha, depois execute; acima → sim explícito. Nunca cite um preço de memória. - Limitado: no máximo 3 tentativas de reparo por etapa, algo muda a cada vez; uma rejeição de política de conteúdo nunca é reenviada inalterada; um trabalho com um ID de requisição é retomado, nunca reenviado.
Barreira de descoberta
scripts/video-surfaces.json é um cache datado (verified_on, lido por democut.py specs): um null é um número que ninguém leu na página oficial, nunca o preencha de memória, e quando uma loja rejeita um arquivo, a página oficial vence e a linha é corrigida.
Antes da primeira chamada paga para um endpoint em uma sessão:
genmedia models --endpoint_id <endpoint_id> --json
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" schema <endpoint_id>
status deve ser active; campos, enums e limites vêm do esquema. Não ativo → o próximo nível dessa tarefa em references/routing-audio.md. Nunca genmedia run com um prompt em vez de um ID de endpoint. Novos lançamentos estão sob namespaces de fornecedores, não apenas fal-ai/.
Roteamento
| Necessidade | Como | Porquê |
|---|---|---|
| Cortar, acelerar, ampliar, emoldurar, juntar, sobrepor, mixar, loudness, GIF, verificações | democut.py (ffmpeg local) | exato, gratuito, repetível; os pixels do produto nunca passam por um modelo |
| Olhar uma gravação ou resultado sem assisti-lo | democut.py analyze, sheet, grab; frames.py sheet | detectores e folhas de contato em vez de adivinhações |
| Narração | fal-ai/elevenlabs/tts/eleven-v3; Turco: fal-ai/gemini-3.1-flash-tts | TTS padrão; o caminho turco é verificado por esquema |
| Trilha sonora, sons de interface | elevenlabs/music/v2.5 (duração exata), fal-ai/elevenlabs/sound-effects/v2 | controle de duração; barato por segundo |
| Temporizações de legenda precisas por palavra | fal-ai/elevenlabs/speech-to-text/scribe-v2 → audiokit.py captions | timestamps por palavra |
| Outro idioma para um arquivo finalizado | fal-ai/elevenlabs/dubbing | uma chamada por idioma |
| Moldura de dispositivo, cartão final, texto exato na imagem | /genmedia-skills:launch-graphics (layers, PNGs compostos) | o texto é composto onde é exato, nunca gerado |
| Placa de fundo atrás de um dispositivo emoldurado | bytedance/seedream/v5/pro/text-to-image | uma placa por vídeo, sem letras |
| Sem ffmpeg local | fal-ai/ffmpeg-api/* em references/routing-utility.md | centavos por chamada, um fallback e não o padrão |
Desempates e armadilhas:
- A interface nunca é gerada, reestilizada, reenquadrada ou "melhorada".
video-reframe,video-edite upscalers repintam o texto da interface: são para filmagens geradas, não para uma gravação. - Ampliação em frações do quadro fonte, leia de
grab --gridousheet --grid;holdpara detalhe,pushuma vez para guiar o olhar,pulluma vez para revelar contexto (references/editing.md). - Uma prévia de loja não é a demonstração com um final mais curto: é sua própria variante com seu próprio subconjunto de cenas.
- Play e Product Hunt aceitam uma URL do YouTube, não um arquivo: entregue o arquivo e diga quem faz o upload.
- Um vídeo de cabeçalho ou resultados de pesquisa da App Store (ativo criativo do iOS 27) é sua própria variante silenciosa e em loop:
appstore-header-video(3840x1646) ouappstore-search-video(3:2), 30 ou 60 fps, 5-30 s, uma ideia, cenas de 2 s ou mais, terminando onde começou. A Apple não lista um vídeo universal; as imagens estáticas são trabalho delaunch-graphics(references/surfaces.mdseção 1a). - Uma gravação de telefone precisa de uma moldura de telefone;
timerecusa uma incompatibilidade de proporção de 30%. - Gravação embutida apenas quando
can.burn_captions; caso contrário, um arquivo adicional, ou a rota de legenda paga, dito claramente. - O usuário nomeou um modelo → use-o após a verificação ao vivo.
Fluxo de trabalho
- Recepção. Objetivo, destinos, gravações, marca. Leia cada arquivo que o usuário nomeou. Em seguida, por gravação:
A resposta carrega tamanho, fps, duração, áudio, qualquer letterboxing embutido e os destinos que a proporção se ajusta. Uma gravação menor que o destino, ou que mostre dados reais, recebe um pedido de regravação agora, não após a edição (python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" init --slug <slug> --name "<Produto>" --target web-16x9 python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" source add --slug <slug> --id app --file ./recordings/demo.mov --os desktopreferences/recording-tips.md). - Olhe para ela.
Leia a folha.python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" analyze --slug <slug> --source app python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" sheet --slug <slug> --source app --count 12 --cols 4 --griddead_spansekeep_spanssão candidatos, nunca uma edição: uma tela parada às vezes é o objetivo.grab --at <s> --gridpara qualquer quadro em que você vai ampliar. - Cartão de corte. Cenas em ordem: id, entrada/saída da fonte, velocidade, zoom, o que o espectador vê, o que a voz diz, duração; em seguida, as variantes, o que é gerado, o que é necessário do usuário e as suposições. Mostre-o, pare, aguarde um sim (
references/editing.md). - Narração, medida (apenas se a demonstração for narrada). Preço e execute um lote por
references/narration-and-audio.md, um arquivo por cena, depois deixe os números decidirem a imagem:python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" price fal-ai/elevenlabs/tts/eleven-v3,elevenlabs/music/v2.5 --explain python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" batch --plan .genmedia/projects/<slug>/demo-video/voice-plan.json - Escreva o corte. Edite
.genmedia/projects/<slug>/demo-video/cut.jsoncom a ferramenta Escrever ou Editar:scenes,audio,variants. Cada campo:references/cut-json.md. Molduras de dispositivo vêm delaunch-graphics layers(references/frames-and-loops.md). - Barreira.
Corrija cada erro antes de renderizar:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" time --slug <slug>scene_shorter_than_voice(alongue o intervalo, diminua a velocidade ou corte palavras — nunca acelere a voz),duration_out_of_rangeem um destino de loja,wrong_size,fps_not_allowed,transition_too_long,frame_aspect_mismatch,overlay_invisible. Aja sobre os avisos (quick_cut,fast_motion,narration_mutedem um vídeo de ativo criativo) ou explique os que você mantém. - Construa.
Timeout Bash de 600000 ms. As cenas são armazenadas em cache por conteúdo: uma revisão re-renderiza apenas o que mudou (python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>--scene <id>,--force). Em seguida, legendas e loops:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" captions --slug <slug> --variant <id> --formats srt,vtt python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" gif --slug <slug> --variant loop-16x9 --budget-mb 3 --seconds 6 - Olhe o resultado. Leia o quadro de pôster, depois uma folha de contato do arquivo finalizado, depois o primeiro quadro do GIF:
Verifique os primeiros 3 segundos, os quadros ampliados (legíveis?), o último quadro (estabilizado?), cada quadro para dados privados e leia o arquivo de sugestões letra por letra.python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3 - Valide e entregue.
Tamanho exato, fps, duração dentro da janela da plataforma, codec e perfil, limite de bytes, configuração de áudio, loudness medido e pico verdadeiro, e em um destino de loop a emenda (python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>loop_seam). Em seguida, a mensagem de entrega. Revisões: edite o corte, reconstrua, valide novamente.
Entrega
<Produto> demo: genmedia-output/<slug>/demo-video/
Master 16:9: web-16x9/<slug>.mp4 (1920x1080, <n> s) · pôster web-16x9/<slug>-poster.png
Prévia App Store: appstore-iphone/<slug>.mp4 (886x1920, <n> s, H.264 High, AAC 256k) <apenas se construído>
Vídeo de cabeçalho / pesquisa App Store: appstore-header-video/<slug>.mov (3840x1646, <n> s, <fps> fps, loop silencioso) · quadro de pôster para selecionar no App Store Connect: <t> s <apenas se construído>
Promo Play / Product Hunt: o mesmo master — ambas as plataformas aceitam uma URL do YouTube, então faça upload e cole o link <apenas se construído>
Loops: loop-16x9/<slug>-loop.mp4 · <slug>-loop.gif (<n> MB, <w>px@<fps>) · primeiro quadro <slug>-loop-first.png <apenas se construído>
Legendas: <variant>/<slug>.srt, .vtt (<language>) <apenas se construído> · manifest.json
Sua gravação, inalterada: cortada, <acelerada onde esperou>, ampliada em <o que>, <emoldurada em um dispositivo desenhado>. Nada na interface foi regenerado.
Escolhido para você: <duração, número de cenas, narração ligada/desligada, música, legendas, molduras, ajuste — todos os padrões que o usuário não definiu>
Notas para loja: <uma linha para cada que se aplica: prévias da App Store têm 15-30 s, até 3 por dispositivo, apenas capturas de tela (2.3.4) · vídeos de cabeçalho e pesquisa em loop sem áudio (pesquisa: nunca sem mudo), mostrados no iOS 27 e iPadOS 27 ou posterior, e seu quadro de pôster é fixado uma vez aprovado · apenas os primeiros 30 s de uma promoção do Play são reproduzidos automaticamente · imagens do Product Hunt, incluindo GIF, ficam abaixo de 3 MB e o GIF anima ao passar o mouse>
Gerado: <nenhum, USD 0 | narração <n> linhas em <modelo>, música, est. USD <x>> · Os arquivos são locais; nada foi enviado.
Próximo: nomeie uma cena e o que mudar (entrada/saída, velocidade, zoom, palavras); recortar é gratuito.
Traduza-o; mantenha caminhos, tamanhos e texto na tela inalterados.
Erros
| Sinal | Faça |
|---|---|
kind: "ffmpeg_missing" | Sem ffmpeg local. Diga que o corte não pode ser feito aqui; ofereça a rota ffmpeg-api da fal (references/routing-utility.md) ou peça ao usuário para instalá-lo. |
source_changed | A gravação foi movida ou alterada. source add --replace, depois verifique novamente cada entrada/saída: as temporizações antigas não significam mais nada. |
check_failed de time | Cada entrada nomeia uma cena e um número. Corrija o corte; nada é renderizado enquanto um erro persistir. |
scene_shorter_than_voice | Alongue o intervalo, diminua speed, ou corte palavras. Nunca acelere a narração para caber. |
duration_out_of_range | Uma janela oficial foi perdida (prévias da App Store 15-30 s, cabeçalho e vídeos de pesquisa 5-30 s). Remova ou encurte cenas apenas para essa variante. |
wrong_size, fps_not_allowed, fps_too_high | O tamanho ou fps da variante quebra sua linha. Remova a substituição ou escolha um valor que a linha aceita (specs). |
loop_seam de validate | O loop salta em seu recomeço. Termine no estado de abertura ou mantenha a mesma região, construa, valide novamente. |
frame_aspect_mismatch | A gravação e a variante diferem em proporção em mais de 30% (a. recuse o destino, b. remova a incompatibilidade, c. informe o |
…
[truncado para tradução]