Aller au contenu principal

Comment rendre une boucle vidéo IA naturelle

Prévoyez un mouvement répétable et raccordez fin et début. Corrigez les ruptures d’image et de son sans inversion trop visible.

Auteur
Lydia
Publié
Lecture
10 min de lecture
Mis à jour
Une femme adulte en robe bordeaux se tient sur un balcon au crépuscule.

Une boucle vidéo IA naturelle exige que la fin se prolonge dans le début : position, direction du mouvement, éclairage et son. Deux poses identiques ne suffisent pas. Partez d’un petit geste qui revient de lui-même, générez un plan court et choisissez le raccord dans un éditeur. Si l’action ne peut pas revenir naturellement, générez le retour dans un second clip, fondez le raccord ou assumez un effet volontaire de lecture avant puis arrière.

Seedance 2.5 image-to-video est un bon point de départ : plans de 4 à 30 secondes, 480p, 720p ou 1080p et image finale facultative. Il n’a pas de bouton de boucle : le raccord vous revient.

Générer un geste qui peut revenir

Préparez une référence 16:9 d’une femme adulte fictive en robe bordeaux entièrement couvrante, près d’une balustrade de balcon. Montrez les deux épaules, laissez de l’espace autour des cheveux et gardez la ville immobile en arrière-plan. Utilisez une pose initiale détendue. Évitez les actions qui changent l’état de la scène : une tasse vidée, un vêtement retiré ou une personne entrant dans le cadre.

Copiez ce prompt de mouvement :

One continuous six-second medium portrait of this fictional adult woman on the balcony. She slowly turns her gaze from the city toward the viewer, holds a soft smile briefly, then returns her head and eyes to the opening position. Her hands stay where they are. The camera stays at the same position and scale. Stable dusk illumination, a still background, very slight hair movement. No cut, no zoom, no new objects, no dialogue.

Essayer dans le Playground

  1. Ouvrez Seedance 2.5 image to video avec ce prompt prérempli. Restez dans l’onglet Playground, en vue Form ; connectez-vous avec un compte approvisionné pour lancer la tâche.
  2. Ajoutez la référence du balcon dans Input image et le même fichier dans Closing frame.
  3. Réglez Duration sur 6, Resolution sur 480p pour le premier aperçu (720p pour la version à garder), laissez Aspect ratio sur Auto, désactivez Generate audio et activez Return last frame sous Advanced parameters.
  4. Vérifiez l’estimation du prix, lancez la tâche et évaluez le raccord comme décrit ci-dessous.

Les mêmes réglages avec leurs noms de champs :

RéglageValeur initialeRaison
image_urlVotre référence approuvéeDevient la première image
last_image_urlLa même référenceDemande une image finale similaire ; ne garantit pas un mouvement compatible
duration_seconds6Laisse le temps de tourner puis de revenir
resolution720p$0,2773 par seconde
aspect_ratioadaptiveSeule valeur acceptée ; recadrez l’entrée au préalable
generate_audiofalseLe son est activé par défaut ; ajoutez l’ambiance séparément
return_last_frametrueFournit l’image finale pour la méthode à deux clips ci-dessous

Six secondes à 720p coûtent $1,6638. Prévisualisez à 480p, 6 s ($0,7404), pour vérifier le mouvement avant la génération à 720p. Les plans longs dérivent davantage : gardez donc une unité courte et répétez-la plutôt que de générer 30 secondes.

Exécuter depuis le code

bash
cat > input.json <<'J'
{
  "prompt": "One continuous six-second medium portrait of this fictional adult woman on the balcony. She slowly turns her gaze from the city toward the viewer, holds a soft smile briefly, then returns her head and eyes to the opening position. Her hands stay where they are. The camera stays at the same position and scale. Stable dusk illumination, a still background, very slight hair movement. No cut, no zoom, no new objects, no dialogue.",
  "image_url": "<your reference image URL>",
  "last_image_url": "<the same reference image URL>",
  "duration_seconds": 6,
  "resolution": "720p",
  "aspect_ratio": "adaptive",
  "generate_audio": false,
  "return_last_frame": true
}
J
spicyapi tasks create --model bytedance/seedance-2.5/image-to-video --input-file input.json --wait

La configuration, l’envoi de fichiers locaux et les résultats sont décrits dans la documentation CLI.

Ou confiez l’exécution à un Agent. Donnez à votre assistant la CLI ci-dessus, le serveur MCP (qui appelle spicyapi_task_create) ou le Skill (npx skills add spicyapi-ai/spicy-skill). La CLI et MCP affichent le prix et demandent confirmation avant une exécution payante.

Trois images illustratives montrent une femme adulte assise sur un balcon, regardant la ville, se tournant vers le spectateur puis revenant à sa pose initiale.

Illustration, pas une image Seedance : une proposition de rotation suivie d’un retour.

Si elle tourne sans revenir, simplifiez l’action en une légère inclinaison de tête plutôt que d’ajouter des instructions. Si toute l’image avance vers le spectateur, retirez le vocabulaire de caméra cinématographique et utilisez une référence avec des repères fixes évidents, comme les coins de la balustrade. Des images initiale et finale identiques encouragent seulement la même composition ; cheveux, manches et mains peuvent quand même finir ailleurs.

Si un seul clip ne revient pas : générer le retour

On conseille généralement des images de début et de fin identiques, mais le milieu du plan peut malgré tout dériver. Une méthode plus contrôlable consiste à utiliser deux clips :

  1. Générez le clip A depuis votre référence avec return_last_frame activé.
  2. Utilisez la dernière image renvoyée par A comme image_url et la référence d’origine comme last_image_url pour générer le clip B, en décrivant le retour, par exemple : "Continuing from this frame, she turns her head and eyes back to the opening position, then holds still. Same camera, same lighting, no cut."
  3. Assemblez A et B. La dernière image de A est la première de B : supprimez donc la première image de B :
bash
ffmpeg -i A.mp4 -i B.mp4 -filter_complex "[1:v]trim=start_frame=1,setpts=PTS-STARTPTS[b];[0:v][b]concat=n=2:v=1:a=0" -an AB.mp4

Vous payez deux clips (2 x $1,6638 = $3,3276 à 6 s, 720p) et devez vérifier les deux raccords (A vers B et fin de B vers début de A, comme décrit ci-dessous), mais les deux clips restent ancrés sur la référence d’origine au point de boucle.

Trouver le raccord en regardant le mouvement, pas seulement les poses

Placez deux copies du candidat à la suite dans votre éditeur et regardez la limite à vitesse normale. Avancez ensuite image par image sur environ cinq images de chaque côté, en suivant un repère comme le bord extérieur de l’épaule. Continue-t-il dans une direction compatible ?

Deux positions d’épaule identiques produisent encore une secousse si la première copie finit en allant à gauche et la seconde commence à droite à pleine vitesse. Pour un geste qui revient, choisissez le raccord près du point de retour détendu, où le mouvement ralentit. Pour un mouvement continu, comme un objet en rotation, faites correspondre position et direction.

Utilisez un coin du décor pour distinguer le mouvement de caméra du geste. Si la balustrade et le visage changent tous deux d’échelle, raccourcir le plan ne peut pas éliminer ce travelling avant. Si seules les paupières changent au raccord, éloignez la coupe du clignement. Si la robe change de décolleté, choisissez un passage intact ou régénérez ; un fondu mélange deux costumes différents.

Des poses d’épaule identiques sont associées à des flèches de mouvement opposées et compatibles au raccord d’une boucle.

Illustration, pas une image Seedance : des poses similaires peuvent masquer des mouvements incompatibles.

Exportez uniquement la plage choisie. Cet exemple conserve les secondes 1 à 5 ; remplacez-les par vos limites :

bash
ffmpeg -i input.mp4 \
  -vf "trim=start=1:end=5,setpts=PTS-STARTPTS" \
  -an -c:v libx264 -crf 18 -pix_fmt yuv420p loop.mp4
ffmpeg -stream_loop 2 -i loop.mp4 -c copy review-three-cycles.mp4

La seconde commande crée seulement un fichier de contrôle de trois cycles. -an retire le son ; ajoutez-le une fois l’image approuvée. Le réglage Repeat ou Loop du lecteur redémarre seulement la lecture et ne masque pas un raccord visible : utilisez donc loop.mp4 comme unité répétée.

Fondre le raccord s’il reste un petit décalage

Un court fondu enchaîné peut atténuer un petit écart de luminosité ou de pose. Il ne peut ni restaurer un objet disparu ni empêcher une double exposition du visage. La commande suivante fond les dernières 0,5 secondes d’un clip de 6 secondes à 24 fps avec ses premières 0,5 secondes, afin que la dernière image de la boucle mène directement à la première. Le résultat dure 5,5 secondes :

bash
ffmpeg -i input.mp4 -filter_complex \
"[0:v]split=3[a][b][c];\
[a]trim=start=5.5:end=6,setpts=PTS-STARTPTS[tail];\
[b]trim=start=0:end=0.5,setpts=PTS-STARTPTS[head];\
[c]trim=start=0.5:end=5.5,setpts=PTS-STARTPTS[mid];\
[tail][head]xfade=transition=fade:duration=0.5:offset=0[xf];\
[xf][mid]concat=n=2:v=1:a=0,format=yuv420p[v]" \
-map "[v]" -an -c:v libx264 -crf 18 blended-loop.mp4

Pour une autre durée D et un chevauchement X, utilisez trim=start=D-X:end=D pour la fin, trim=start=0:end=X pour le début et trim=start=X:end=D-X pour le milieu, avec duration=X dans xfade. Inscrivez les nombres calculés dans la commande. Commencez par 8 à 12 images de chevauchement. Si les yeux se dédoublent ou si les doigts laissent des traînées transparentes, raccourcissez le chevauchement ou abandonnez le fondu.

Un portrait net et aligné contraste avec un fondu désaligné où les traits du visage et les mains sont dédoublés.

Illustration, pas une image Seedance : un fondu désaligné dédouble les traits du visage.

Le fondu convient à un portrait presque immobile. Il convient mal à une grande rotation de tête, des mains superposées ou un mouvement de caméra. Si le problème est un petit changement d’exposition, équilibrez les deux extrémités avant le fondu ; si la géométrie change, revenez au choix de la source.

Créer un boomerang volontaire si l’inversion convient

Une boucle en lecture avant puis arrière fonctionne pour une légère inclinaison de tête. Ne l’utilisez pas pour la parole, la marche vers l’avant, des cheveux qui tombent, de l’eau versée ou une main posant un objet : la causalité inversée se voit.

La commande prend les cinq premières secondes à 24 fps, lit les images 0 à 119 vers l’avant, puis 118 à 1 vers l’arrière, en supprimant les images d’extrémité dupliquées qui créeraient une brève pause :

bash
ffmpeg -i input.mp4 -filter_complex \
"[0:v]fps=24,trim=start_frame=0:end_frame=120,setpts=PTS-STARTPTS,split[f][r];[r]reverse,trim=start_frame=1:end_frame=119,setpts=PTS-STARTPTS[back];[f][back]concat=n=2:v=1:a=0,format=yuv420p[v]" \
-map "[v]" -an -c:v libx264 -crf 18 boomerang.mp4

La source doit contenir au moins cinq secondes de vidéo ; la sortie compte 238 images, soit environ 9.9 secondes. Choisissez une source dont le mouvement ralentit aux extrémités, sinon le changement de direction paraît encore brusque. Le filtre reverse met en mémoire tout ce qu’il traite : découpez donc d’abord un court passage (documentation des filtres FFmpeg).

Ajouter le son une fois l’image au point

Pour un aperçu de profil silencieux, gardez la boucle muette. Pour l’ambiance, placez une piste séparée de son de pièce ou de ville sous plusieurs cycles, fondez ses extrémités indépendamment de l’image et écoutez la répétition au casque. Pour créer une piste trois fois plus longue avec des raccords doux, fondez des copies d’un fichier d’ambiance (chaque raccord raccourcit le résultat d’une seconde) :

bash
ffmpeg -i bed.wav -i bed.wav -i bed.wav -filter_complex "[0][1]acrossfade=d=1[x];[x][2]acrossfade=d=1" bed3.wav

N’inversez pas la parole et n’associez pas un événement sonore distinct à chaque répétition, sauf si c’est voulu.

Avant livraison, vérifiez le fichier de trois cycles à sa taille d’affichage : saut de caméra, saut de vêtement, visage dédoublé ou clic audio. Si le portrait est stable mais qu’un détail du décor refuse de boucler, une cinémagraphie masquée est l’alternative : conservez un portrait fixe approuvé et animez seulement une zone séparée de rideau ou de lumière. C’est du compositing autour d’un sujet statique, pas une interprétation générée sans raccord visible.

Aussi en English · 日本語 · 한국어 · Deutsch · Español · Português (Brasil) · Русский · Italiano · Polski