Tutorial de tela em uma timeline do Resolve
Converte uma descrição de tutorial (film.json) e suas screenshots em uma timeline que um editor pode continuar trabalhando. Os clipes têm keyframes comuns no Inspector, os títulos são do Fusion com controles no Inspector e as cenas são marcadas. Não adiciona áudio, então narração e música vão depois.
A API do Resolve não consegue definir keyframes nem a duração de um título, então o build os escreve em um arquivo de timeline e o importa. references/how-it-works.md explica isso e lista problemas conhecidos. Leia-o se uma etapa falhar ou se o Resolve for mais novo que 21.2.
Antes de começar
- O Resolve Studio está em execução com um projeto aberto. Verifique com
get_resolve_statuse chameget_whats_newuma vez comsincedefinido como21.0, conforme solicitado pelo servidor do Resolve. - Fora do Resolve: Python com
pillowe ffmpeg no PATH. - O formato da timeline do projeto deve ser 1920x1080.
preflightverifica isso.
Decida com o usuário
Resolva estes pontos a partir da conversa se possível, e pergunte apenas sobre o que estiver faltando:
- O projeto. A timeline vai para o projeto aberto. Dê a ele o nome do usuário. Trocar de projeto pode perder o trabalho não salvo deles, então peça que troquem se for o errado.
- As screenshots. Elas vêm do usuário ou você as captura. Com Playwright, use uma viewport de 1920x1080 com
deviceScaleFactor: 2: as imagens saem em 3840x2160, egetBoundingClientRectfornece posições que já estão corretas parafilm.json. Analise cada imagem fornecida, use as que se encaixam no público e informe ao usuário o que você deixou de fora. - A marca. Cores, fonte, logotipo e quaisquer rótulos como Host ou Admin. Procure primeiro no código do usuário ou em títulos anteriores. O Text+ só vê fontes instaladas, e não instale uma sem perguntar.
- O nome da timeline. Escolha um que esteja livre. Nunca substitua uma timeline que você não construiu.
Escreva o filme
Crie uma pasta para o filme e escreva film.json nela. references/film-format.md tem o formato. Leia-o agora.
Alguns tempos que funcionam bem:
- Mostre uma cena por 6 a 10 s e mantenha uma legenda visível tempo suficiente para ser lida duas vezes, cerca de 1 s para cada 8 caracteres.
- Mova a câmera em cerca de 1 s e deixe-a estabilizar antes de o cursor se mover ou o destaque aparecer.
- Mova o cursor em cerca de 0,8 s e clique cerca de 0,3 s depois que ele pousar.
- Mostre o resultado de um clique com um novo plano logo após, se o layout do novo plano se alinhar no zoom atual. Se a página mudar completamente, termine a cena logo após o clique e deixe o dissolve levar para a próxima.
- Para manter o cursor parado durante um dissolve, inicie o cursor da próxima cena no mesmo lugar no quadro, usando
x' = tx + x * zoom. - Use um cartão de cerca de 3 s em cada extremidade.
As legendas devem dizer apenas o que as screenshots mostram ou o que o usuário lhe disse, e qualquer inferência sua vai no relatório.
Um destaque que erra seu botão é o erro mais visível que este formato pode produzir, então meça em vez de estimar. As imagens podem ser exibidas em uma escala diferente do tamanho real, portanto não leia posições diretamente delas:
python "<SKILL>/scripts/measure.py" grid shot.png grid.png
Abra grid.png, que tem coordenadas do quadro marcadas, para encontrar um ponto aproximado no preenchimento do botão. Em seguida, obtenha seu retângulo exato e verifique o resultado:
python "<SKILL>/scripts/measure.py" at shot.png 1250 470
python "<SKILL>/scripts/measure.py" show shot.png check.png 1200,450,180,40
Um botão cuja borda combina com uma cor próxima pode vazar, então leia os avisos e reduza a tolerância se o retângulo parecer grande demais.
Construir
SKILL é a pasta desta skill e WORK é a pasta do filme. Os passos do shell são executados de qualquer lugar. Os passos do Resolve vão por run_script_unsafe. Passe timeout: 60 em cada chamada, pois o padrão da ferramenta é 10 s e os passos podem demorar mais. Cada um começa com:
SKILL = r'<pasta desta skill>'; WORK = r'<pasta do filme>'
exec(open(SKILL + r'\scripts\resolve_steps.py', encoding='utf8').read())
Antes de film.json existir, project_format(project) fornece o tamanho do projeto, taxa de quadros e timelines, e fonts_available('Lato', ...) as fontes instaladas e seus estilos. Defina fps para a taxa do projeto, a menos que haja um motivo para não fazer isso.
1. Verifique o projeto. Corrija qualquer coisa em problems antes de prosseguir, perguntando ao usuário quando for da alçada dele, e repasse quaisquer notes. Não altera nada.
result = preflight(project, WORK)
2. Planeje e instale os títulos. Leia os avisos e corrija o que for importante em film.json. Isso coloca os títulos na pasta Templates do Resolve para a marca, substituindo quaisquer outros com os mesmos nomes, então avise o usuário.
python "<SKILL>/scripts/plan.py" "<WORK>"
python "<SKILL>/scripts/templates.py" "<WORK>" --install
3. Construa a timeline. Isso exporta os blocos de construção, escreve o arquivo de timeline, importa-o, aplica as configurações que a API pode definir, verifica o resultado e remove as duas timelines de rascunho desta construção. Ela só substitui uma timeline que esta pasta construiu, e as edições feitas nela são perdidas, então pergunte primeiro se o usuário pode tê-la editado.
result = build_film(project, WORK)
verify.problems deve estar vazio. Se done for falso, repita result = finish_batch(project, WORK) até que seja verdadeiro, então execute result = dict(verify=verify(project, WORK), cleanup=cleanup(project, WORK)). O Resolve pode levar alguns segundos para ver títulos recém-instalados, então build_film espera por eles. Se ainda assim não conseguir inseri-los, peça ao usuário para reiniciar o Resolve após salvar o trabalho.
Não exclua bins, aqui ou ao fazer limpeza: clipes podem ser vinculados de um bin a timelines em outro lugar (veja references/how-it-works.md).
4. Dê uma olhada. Isso exporta folhas rotuladas de quadros diretamente da timeline: cada cena, o meio de cada destaque e logo após cada clique. Leva alguns segundos e não precisa de render, então as configurações de render não mudam. Abra as folhas em build/review/.
result = review_frames(project, WORK)
Verifique se os destaques estão sobre seus elementos, o cursor pousa onde deveria, as ondas estão visíveis, as legendas cabem e nada está preto. Para uma análise mais detalhada, review_frames(project, WORK, seconds=[10.5, 20.2]) fornece esses momentos em tamanho real, em segundos da timeline. plan.py imprime quando cada cena começa, para converter os tempos das cenas.
Os quadros correspondem a uma renderização do mesmo quadro, testado no Resolve 21.2. review_frames precisa da API de exportação de quadros que o 21.2 tem. Em um Resolve mais antigo, ele gera um erro, e a renderização abaixo faz o trabalho: execute review.py nela sem uma referência para obter as mesmas folhas.
5. Renderize, quando precisar de um arquivo. Renderize para dar ao usuário um vídeo, ou para a comparação do remotion-to-resolve. start_render altera as configurações de render do projeto, então avise.
result = start_render(project, WORK, 'review')
result = wait_render(project, '<id do job>', 50) # repita até que o status seja Completo
python "<SKILL>/scripts/review.py" "<WORK>" "<WORK>/build/render/review.mp4"
Remova seu job, e apenas o seu, já que a fila pode conter jobs do usuário:
result = remove_job(project, '<id do job>')
Para alterar algo, edite film.json, execute plan.py e chame build_film novamente, então verifique novamente. Se você renderizou, remova o job primeiro. Execute templates.py novamente também se a marca ou fps mudaram. Se o usuário editou a timeline manualmente, pergunte antes de reconstruir, ou faça a alteração manualmente na timeline.
Finalizar
Deixe o salvamento para o usuário, a menos que ele peça, pois salvar também confirma quaisquer outras edições não salvas que ele tenha abertas. Relate:
- a timeline e o bin, e as faixas
- onde os títulos foram instalados
- que a nova timeline agora é a atual, nomeando aquela que
preflightencontrou aberta, e, se você renderizou, que as configurações de render mudaram - qualquer redação de legenda que você inferiu e qualquer coisa nas screenshots que conflite com o briefing
- o que você verificou e o que não verificou. Os quadros mostram a imagem, mas não o movimento ou como o Inspector e a timeline aparecem no Resolve.
- qualquer coisa aproximada e estes limites: sem áudio, apenas imagens estáticas e destaques que permanecem no quadro durante os movimentos da câmera
Os clipes vêm de seus arquivos no disco, então mover a pasta do filme ou as screenshots tira os clipes offline. Mantenha build/assets/ também, pois o cursor e os fundos estão lá.
Para remover os títulos de uma marca da Biblioteca de Efeitos, execute templates.py "<WORK>" --uninstall. Ele remove apenas os quatro arquivos daquela marca. As timelines já construídas mantêm suas próprias cópias: uma renderização após a remoção ficou idêntica.