Montage de reel pour téléphone
La plupart des règles ici proviennent d'un vrai reel qui a échoué à cette étape en premier. references/research.md contient les raisons et les sources. references/resolve-ui.md mappe les contrôles de DaVinci Resolve pour le piloter avec l'utilisation de l'ordinateur.
Certains cas n'ont pas encore été testés sur un reel publié : sources HDR, ralenti à 30 ips, discours face caméra, zones de sécurité TikTok et Shorts, et couvertures. Leurs commandes n'ont été exécutées que sur des clips de test. references/other-cases.md les contient et explique comment chacun a été vérifié. Prévenez l'utilisateur lorsqu'une édition repose sur l'un d'eux.
Pipeline : source téléphone, coupe et stabilisation ffmpeg, couleur (DaVinci Resolve, ou scripts/grade.py pour les mouvements globaux), texte Remotion, son et mastering ffmpeg.
Avant la coupe
- Lisez les règles de la marque pour le client, s'il y en a : mots interdits, ligne de contact, étiquetage IA, et ce qui nécessite une approbation avant publication.
- Vérifiez chaque clip source :
python -I scripts/probe_source.py clip.mp4. Il indique la rotation, la fréquence d'images et sa variabilité, SDR ou HDR, les étiquettes de couleur et l'audio, puis liste ce dont le clip a besoin avant le montage. Les clips typiques de téléphone sont SDR bt709 à environ 30 ou 60 ips. Les sources HDR, à fréquence d'images variable et à 30 ips nécessitent chacune une étape supplémentaire, dansreferences/other-cases.md. Si une personne parle en arrière-plan, le son original reste muet. Si la personne à l'écran parle au spectateur, consultez la section dédiée du même fichier. - Si vous utilisez un deuxième modèle d'IA comme relecteur, discutez de l'idée avec lui avant de décider, puis vérifiez ce qu'il dit.
references/research.mdliste les types d'erreurs qu'un modèle relecteur a commises.
Rythme
- Une idée par reel. Le texte détermine la durée, pas un nombre cible. Un reel de test a nécessité 18,6 s parce que le client n'a pas pu finir de lire à 10,5 s ou 13,5 s.
- Prévoyez 10 caractères arabes par seconde, comptés à partir de l'apparition d'une ligne. C'est lent intentionnellement : le spectateur regarde aussi l'image sur un téléphone.
- Deux apparitions par plan si possible, et au moins 1,5 s entre elles. Les lignes qui apparaissent ensemble comptent comme une seule apparition.
- L'avis d'un locuteur natif sur le rythme prime sur celui de tout modèle.
- L'image la plus forte et le texte d'accroche sont à l'écran à l'image 0, sans fondu depuis le noir.
- Évitez une accélération soudaine de 3x. Accélérez doucement pour passer un mauvais moment plutôt.
Le 60 ips joué à 0,5x donne des images réelles à 30 ips, donc aucune interpolation n'est nécessaire. Une source à 30 ips n'a pas d'images de réserve, donc lisez la section sur le ralenti de references/other-cases.md avant de ralentir une. Stabilisez vers un intermédiaire 60 ips, puis retemporalisez :
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
Exécutez les chemins scripts/ depuis le dossier de cette compétence. ffmpeg a besoin des filtres vidstab. Chaque clip doit commencer au temps zéro, car un début non nul apparaît comme des images noires en tête dans Resolve. Ajoutez setpts=PTS-STARTPTS lorsque vous utilisez -ss avec un filtre temporel, et vérifiez start_time avec ffprobe.
Une main qui dérive dans les dernières images d'un plan fixe peut être cachée en maintenant une image antérieure : trim=end_frame=N,setpts=PTS-STARTPTS,tpad=stop_mode=clone:stop_duration=0.6.
Couleur
La couleur ici signifie correction : blancs neutres, peau naturelle, couleurs produit fidèles, raccord entre les plans. Un look créatif vient en dernier et reste subtil, et les couleurs produit doivent toujours être mesurées comme vraies après.
Choisissez la voie en fonction de ce dont le plan a besoin :
- Mouvements globaux uniquement (teinte, exposition, contraste, saturation) :
scripts/grade.py. C'est plus rapide et reproductible, et les chiffres restent dans une commande que vous pouvez réexécuter. - Une partie du cadre a besoin de sa propre correction (peau sous une lumière différente, un objet) : DaVinci Resolve, pour ses Power Windows.
Les deux voies utilisent la même boucle de mesure, ajustement, mesure et les mêmes cibles ci-dessous.
Avec 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 est une zone qui devrait être grise ou blanche : un comptoir, un mur, du papier, un couvercle blanc. make égalise ses R, V et B, et --white définit le niveau auquel elle aboutit. Choisissez une zone uniformément éclairée et non soufflée. Regardez l'image --compare en taille réelle, et mesurez la moitié corrigée, avant d'appliquer. Une LUT par plan, car chaque plan a sa propre dominante.
Ajoutez --knee 0.85 lorsqu'un gain pousse les hautes lumières au-delà de 250. Utilisez --denoise light uniquement sur les clips visibles et bruyants en faible lumière, et --sharpen rarement : les téléphones affinent déjà, et plus de netteté donne des auréoles sur les bords et le texte.
Une correction faite dans Resolve peut en sortir une LUT : clic droit sur la vignette du clip dans la page Couleur, Générer LUT, Cube 33 points. grade.py apply --lut l'applique ensuite à n'importe quel clip. Une LUT ne contient que des mouvements globaux, donc les fenêtres n'y sont pas.
Dans DaVinci Resolve gratuit
Copiez les clips dans un dossier simple que Resolve peut voir (il ne peut pas ouvrir certains dossiers de données d'applications et dit "Le chemin n'existe pas"). Placez-les sur une nouvelle timeline et ouvrez le scope Parade.
Travaillez dans cet ordre, car chaque étape dépend de la précédente :
- Nœud Balance. Gain pour le niveau de blanc, Temp pour la dominante. Temp positif réchauffe. La même surface dans deux plans doit correspondre.
- Nœud Contraste. Contraste et Pivot, Lift pour les noirs profonds, un petit mouvement Sat de 5 ou moins.
- Nœud Sujet, seulement lorsqu'un mouvement global nuirait à autre chose. Utilisez une Power Window douce. Sur le reel de test, une fenêtre a corrigé la peau d'une main sans toucher aux couleurs du produit.
- Rendu, mesure, ajustement, et répétez. Deux passages ont suffi.
python -I scripts/measure_grade.py frame.png --patch counter:40,60,200,220 --skin 100,1450,1000,1920
Cibles
- Surfaces neutres : R, V et B à environ 3 à 5 près. Blanc entre 195 et 215 pour un aspect lumineux.
- Teinte de la peau près de 123 degrés. Restez naturel, car la ligne du vectorscope est une référence, pas une cible.
- Luminosité de la peau : les guides la situent entre 40 % et 70 % selon la peau et la scène. Utilisez cette plage pour détecter une erreur, pas comme un chiffre à atteindre.
- Hautes lumières : moins d'environ 2 % des pixels à 250+.
- Saturation : comparez la ligne
chromaavant et après. Une correction devrait laisser p95 proche de là où elle était. Un grand saut signifie que la correction ajoute de la couleur que la scène n'avait pas. - Les couleurs produit restent fidèles lorsque la vidéo vend un produit.
- Deux plans de la même surface donnent les mêmes mesures.
Ce qui déplace quoi :
- Teinte a à peine bougé une paume rouge. Gamma par canal l'a corrigée : V augmenté, R et B diminués un peu.
- Temp +300 a dépassé une dominante bleue alors que +130 était juste. Commencez petit.
Texte arabe dans Remotion
assets/reelTemplate.tsx est un modèle fonctionnel. Il conserve chaque bloc de texte comme donnée et dispose d'une composition sonde pour la vérification du texte. references/remotion-setup.md couvre le démarrage d'un projet à partir de rien et l'enregistrement des compositions.
Règles :
- Une police arabe grasse (le modèle utilise Alexandria 800), blanc plus une couleur d'accent, pas de boîtes, une ombre douce.
- Tailles de 62 à 124 px sur une trame 1080x1920. Un téléphone a besoin de cette taille.
- Hauteur de ligne 1,5 pour l'arabe. À 1,22, les queues de lettres touchent la ligne suivante.
- Chaque lettre à l'intérieur de x 110-950 et y 220-1475, afin que le rail droit et la barre inférieure d'Instagram ne couvrent rien.
whiteSpace: nowrappour qu'une ligne ne soit jamais coupée par surprise.- Accroche à l'image 0. Les lignes suivantes à environ 1 s d'intervalle, avec une montée et une disparition de 6 images.
- Une bande sombre et douce derrière le texte maintient le sujet visible en dessous.
- Les citations des clients restent mot pour mot, sans nom ni photo sauf si le client a accepté.
- Dites ce que le spectateur voit. Ne laissez pas une étiquette sous-entendre que c'est la seule option.
Après tout changement de texte, rendez les images de la sonde et vérifiez-les :
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
Il échoue lorsque l'encre de deux lignes est à moins de 14 px ou qu'une lettre quitte la zone de sécurité. Un bloc contient au maximum sept lignes.
Ensuite, vérifiez le texte par rapport à l'image réelle. Rendez la dernière image de chaque plan, lorsque toutes les lignes sont à l'écran, et passez ces images dans le même ordre :
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
Chaque ligne obtient une valeur de contraste par rapport à la partie la plus lumineuse de l'image autour de ses lettres, et en dessous de 3,0 échoue. Sur le reel de test, les lignes de couleur d'accent ont obtenu 3,2 à 4,6 et les lignes blanches 5 et plus. Un score bas signifie une bande plus forte derrière le texte, ou un déplacement du bloc.
La boîte par défaut est celle d'Instagram. Pour un reel qui va aussi sur TikTok ou Shorts, ajoutez --platform all. Ces deux boîtes proviennent de guides tiers, donc prévisualisez le téléchargement dans chaque application.
Ensuite, regardez les images en taille réelle à la fin de chaque plan. Une feuille de vignettes cache les collisions, et les choses qui bougent derrière le texte n'apparaissent qu'en taille réelle. Sur le reel de test, une cuillère a traversé une ligne. Un petit zoom avec une origine de coin l'a déplacée et a également recadré un doigt errant.
Rendu et son
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 est important. Sans lui, Remotion écrit du bt470bg pleine plage avec des primaires inconnues.
Coupez la musique au meilleur décalage, fondez la dernière 1,2 s, assemblez avec -c:v copy, puis masterisez :
sh scripts/master.sh in.mov out.mp4 -14 0.4 0.75
Le dernier nombre est le plafond du limiteur. AAC ajoute un dépassement au-dessus, et la quantité dépend de la piste, donc le script mesure le fichier qu'il a écrit et imprime sa sonie et son pic réel. S'il imprime TOO HOT (pic réel au-dessus de -1 dBTP), exécutez-le à nouveau avec 0,7.
Les haut-parleurs de téléphone perdent la plupart du son en dessous de 300 Hz, donc vérifiez cette bande :
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
Visez -20 LUFS ou plus dans cette bande sur un master à -14 LUFS. Une piste riche en basses mesurait -23,9 et sonnait terne sur les téléphones. Dessinez aussi la forme d'onde et le spectre, car les horodatages d'un modèle relecteur ne correspondent pas toujours.
La musique ou la voix générée par IA a besoin de l'étiquette IA de la plateforme. Générez une musique légèrement plus longue que le reel, car une piste coupée trop court ne peut pas être étendue proprement.
Vérifications avant de déclarer terminé
- ffprobe montre
yuv420p, tv, bt709, bt709, bt709, et la bonne durée et le bon nombre d'images. check_text.pyimite PASS, avec les images--realincluses.master.sha imprimé un pic réel à -1 dBTP ou moins.- Une image de couverture existe si le reel apparaît sur une grille de profil (
references/other-cases.md). - Regardez les images en taille réelle vous-même, y compris la première et la dernière image et l'image avant chaque coupe.
- Si un modèle relecteur regarde le mp4 final, donnez-lui les décisions déjà prises pour qu'il ne les rouvre pas.
- Indiquez ce qui n'a pas été vérifié. Un agent ne peut pas entendre l'audio ni voir le fichier sur un téléphone.
- Après avoir remplacé un fichier déjà téléchargé quelque part, re-téléchargez-le, vérifiez-le à partir du lien public, et mettez à jour tout ce qui était programmé et pointant vers l'ancien fichier.
La publication nécessite l'approbation du client.