Que fait Tutoriel d'écran sur une timeline Resolve ?
Transforme une description d'un tutoriel (film.json) et ses captures d'écran en une timeline qu'un monteur peut continuer à travailler. Les clips ont des keyframes ordinaires dans l'Inspector, les titres sont des titres Fusion avec des contrôles dans l'Inspector, et les scènes sont marquées. Il n'ajoute pas de son, donc la narration et la musique viendront après.
L'API Resolve ne peut pas définir de keyframes ni la durée d'un titre, donc la construction les écrit dans un fichier de timeline et l'importe. references/how-it-works.md explique cela et liste les problèmes connus. Lisez-le si une étape échoue ou si Resolve est plus récent que la version 21.2.
Avant de commencer
- Resolve Studio est en cours d'exécution avec un projet ouvert. Vérifiez avec
get_resolve_status, et appelezget_whats_newune fois avecsincedéfini à21.0, comme le demande le serveur Resolve. - En dehors de Resolve : Python avec
pillow, et ffmpeg dans le PATH. - Le format de la timeline du projet doit être 1920x1080.
preflightvérifie cela.
Décider avec l'utilisateur
Réglez ces points à partir de la conversation si possible, et ne demandez que ce qui manque :
- Le projet. La timeline va dans le projet ouvert. Nommez-le d'après l'utilisateur. Changer de projet pourrait perdre leur travail non sauvegardé, donc demandez-leur de changer si ce n'est pas le bon.
- Les captures d'écran. Elles viennent de l'utilisateur, ou vous les capturez. Avec Playwright, utilisez une fenêtre de 1920x1080 avec
deviceScaleFactor: 2: les images sortent en 3840x2160, etgetBoundingClientRectdonne des positions déjà correctes pourfilm.json. Examinez chaque image fournie, utilisez celles qui correspondent au public, et dites à l'utilisateur ce que vous avez laissé de côté. - La marque. Couleurs, police, logo, et toutes les étiquettes telles que Hôte ou Administrateur. Cherchez d'abord dans le code de l'utilisateur ou les titres précédents. Text+ ne voit que les polices installées, et n'en installez pas sans demander.
- Le nom de la timeline. Choisissez-en un qui est libre. Ne remplacez jamais une timeline que vous n'avez pas construite.
Écrire le film
Créez un dossier pour le film et écrivez film.json dedans. references/film-format.md contient le format. Lisez-le maintenant.
Quelques timings qui rendent bien :
- Affichez une scène pendant 6 à 10 s, et gardez une légende assez longtemps pour être lue deux fois, environ 1 s pour 8 caractères.
- Déplacez la caméra sur environ 1 s, et laissez-la se stabiliser avant que le curseur ne bouge ou que la surbrillance n'apparaisse.
- Déplacez le curseur sur environ 0,8 s, et cliquez environ 0,3 s après son arrivée.
- Montrez le résultat d'un clic avec un nouveau plan juste après, si la mise en page du nouveau plan s'aligne au zoom actuel. Si la page change complètement, terminez la scène juste après le clic et laissez le fondu enchaîné porter vers la suivante.
- Pour garder le curseur immobile pendant un fondu enchaîné, commencez le curseur de la scène suivante au même endroit sur l'image, en utilisant
x' = tx + x * zoom. - Utilisez une carte d'environ 3 s à chaque extrémité.
Les légendes ne doivent dire que ce que les captures d'écran montrent ou ce que l'utilisateur vous a dit, et tout ce que vous avez déduit va dans votre rapport.
Une surbrillance qui manque son bouton est l'erreur la plus visible que ce format peut produire, donc mesurez plutôt que d'estimer. Les images peuvent s'afficher à une échelle différente de leur taille réelle, donc ne lisez pas les positions directement dessus :
python "<SKILL>/scripts/measure.py" grid shot.png grid.png
Ouvrez grid.png, qui a des coordonnées d'image marquées, pour trouver un point approximatif sur le remplissage du bouton. Ensuite, obtenez son rectangle exact et vérifiez le résultat :
python "<SKILL>/scripts/measure.py" at shot.png 1250 470
python "<SKILL>/scripts/measure.py" show shot.png check.png 1200,450,180,40
Un bouton dont la bordure correspond à une couleur voisine peut fuiter, donc lisez les avertissements et abaissez la tolérance si le rectangle semble trop grand.
Construction
SKILL est le dossier de cette compétence et WORK est le dossier du film. Les étapes shell s'exécutent depuis n'importe où. Les étapes Resolve passent par run_script_unsafe. Passez timeout: 60 à chaque appel, car la valeur par défaut de l'outil est de 10 s et les étapes peuvent prendre plus de temps. Chacune commence par :
SKILL = r'<ce dossier de compétence>'; WORK = r'<dossier du film>'
exec(open(SKILL + r'\scripts\resolve_steps.py', encoding='utf8').read())
Avant que film.json n'existe, project_format(project) donne la taille du projet, la fréquence d'images et les timelines, et fonts_available('Lato', ...) les polices installées et leurs styles. Définissez fps à la fréquence du projet sauf s'il y a une raison de ne pas le faire.
1. Vérifier le projet. Corrigez tout ce qui est dans problems avant de continuer, en demandant à l'utilisateur quand c'est sa décision, et transmettez les éventuelles notes. Cela ne change rien.
result = preflight(project, WORK)
2. Planifier et installer les titres. Lisez les avertissements et corrigez ce qui est important dans film.json. Cela place les titres dans le dossier Modèles de Resolve pour la marque, en remplaçant ceux qui ont le même nom, donc prévenez l'utilisateur.
python "<SKILL>/scripts/plan.py" "<WORK>"
python "<SKILL>/scripts/templates.py" "<WORK>" --install
3. Construire la timeline. Cela exporte les blocs de construction, écrit le fichier de timeline, l'importe, applique les paramètres que l'API peut définir, vérifie le résultat et supprime les deux timelines temporaires de cette construction. Elle ne remplace qu'une timeline que ce dossier a construite, et les modifications qui y sont apportées sont perdues, donc demandez d'abord si l'utilisateur a pu la modifier.
result = build_film(project, WORK)
verify.problems doit être vide. Si done est faux, répétez result = finish_batch(project, WORK) jusqu'à ce qu'il soit vrai, puis exécutez result = dict(verify=verify(project, WORK), cleanup=cleanup(project, WORK)). Resolve peut prendre quelques secondes pour voir les titres nouvellement installés, donc build_film les attend. S'il ne peut toujours pas les insérer, demandez à l'utilisateur de redémarrer Resolve après avoir sauvegardé son travail.
Ne supprimez pas les bacs, ici ou lors du nettoyage : les clips peuvent être liés d'un bac à des timelines ailleurs (voir references/how-it-works.md).
4. Examiner le résultat. Cela exporte des feuilles d'images étiquetées directement depuis la timeline : chaque scène, le milieu de chaque surbrillance, et juste après chaque clic. Cela prend quelques secondes et ne nécessite aucun rendu, donc les paramètres de rendu ne changent pas. Ouvrez les feuilles dans build/review/.
result = review_frames(project, WORK)
Vérifiez que les surbrillances sont sur leurs éléments, le curseur atterrit là où il doit, les ondulations sont visibles, les légendes tiennent, et rien n'est noir. Pour un examen plus détaillé, review_frames(project, WORK, seconds=[10.5, 20.2]) donne ces moments en taille réelle, en secondes de timeline. plan.py imprime le début de chaque scène, pour convertir à partir des temps de scène.
Les images correspondent à un rendu de la même image, comme testé sur Resolve 21.2. review_frames a besoin de l'API d'exportation d'images que 21.2 possède. Sur un Resolve plus ancien, cela génère une erreur, et le rendu ci-dessous fait le travail : exécutez review.py dessus sans référence pour obtenir les mêmes feuilles.
5. Rendu, lorsque vous avez besoin d'un fichier. Le rendu pour donner une vidéo à l'utilisateur, ou pour la comparaison de remotion-to-resolve. start_render modifie les paramètres de rendu du projet, donc dites-le.
result = start_render(project, WORK, 'review')
result = wait_render(project, '<job id>', 50) # répéter jusqu'à ce que le statut soit Terminé
python "<SKILL>/scripts/review.py" "<WORK>" "<WORK>/build/render/review.mp4"
Supprimez votre tâche, et seulement la vôtre, car la file d'attente peut contenir celle de l'utilisateur :
result = remove_job(project, '<job id>')
Pour changer quelque chose, modifiez film.json, exécutez plan.py, puis appelez build_film à nouveau, puis examinez à nouveau. Si vous avez fait un rendu, supprimez d'abord la tâche. Exécutez aussi templates.py à nouveau si la marque ou fps a changé. Si l'utilisateur a modifié la timeline manuellement, demandez avant de reconstruire, ou effectuez la modification manuellement sur la timeline.
Fin
Laissez la sauvegarde à l'utilisateur sauf s'il le demande, car sauvegarder valide aussi toutes les autres modifications non sauvegardées qu'il a ouvertes. Rapportez :
- la timeline et le bac, ainsi que les pistes
- où les titres ont été installés
- que la nouvelle timeline est maintenant celle en cours, en nommant celle que
preflighta trouvée ouverte, et, si vous avez fait un rendu, que les paramètres de rendu ont changé - toute formulation de légende que vous avez déduite, et tout dans les captures d'écran qui entre en conflit avec le brief
- ce que vous avez vérifié, et ce que vous n'avez pas vérifié. Les images montrent l'image, mais pas le mouvement ni l'apparence de l'Inspector et de la timeline dans Resolve.
- tout ce qui a été approximé, et ces limites : pas d'audio, uniquement des images fixes, et des surbrillances qui restent sur l'image pendant les mouvements de caméra
Les clips proviennent de leurs fichiers sur disque, donc déplacer le dossier du film ou les captures d'écran rend les clips hors ligne. Conservez aussi build/assets/, car le curseur et les arrière-plans y résident.
Pour supprimer les titres d'une marque de la Bibliothèque d'effets, exécutez templates.py "<WORK>" --uninstall. Cela ne supprime que les quatre fichiers de cette marque. Les timelines déjà construites conservent leurs propres copies : un rendu après leur suppression est sorti identique.