Allez on enchaine avec un second article déjà, un an et demi après le premier. Ce journal démarre, on peut le dire, sur les chapeaux de roues.
Après s'être essayé à des bribes d'animation avec ImageMagick, on va s'intéresser à une librairie tout aussi dépourvue d'interface (la quête de l'imprévu toujours) mais cette fois dédiée à la vidéo : FFmpeg
Un peu comme c'était le cas pour ImageMagick, je connaissais FFmpeg de longue date mais hormis de rares besoins d'encodages spécifiques je n'avais que peu de raisons de le préférer à Media Encoder pour de l'usage au quotidien.
Ce n'est que plus récemment, via la scène Vjing de Mastodon et notamment Pixelflowers que je me suis intéressé à FFmpeg sous l'angle de la création visuelle plutôt que celui de simple encodeur.
Un de leur post (qui n'est plus en ligne) montrait un visuel glitché, un lien vers un article contenant des images tout aussi intrigantes et surtout, ce qui m'a poussé à creuser un peu plus, une commande FFmpeg.
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -an -c:v libxvid -q 10 -filter_complex '[0][1][2]displace=edge=smear' displacedvideo.avi
Pour l'instant j'ai peu d'informations sur son fonctionnement mais essayons :
Ok, je ne comprends pas encore tout ce qui se passe mais les résultats m'intéressent. Pour y voir un peu plus clair je me rends sur la documentation FFmpeg de la commande Displace.
Les 3 entrées correspondent donc dans l'ordre à :
Le paramètre edge permet de spécifier différentes méthodes pour remplacer les pixels hors champs.
Ceux qui connaissent l'effet « Displacement Map » d'After Effects me diront qu'on peut obtenir la même chose avec plus de contrôle et ils auront raison. et bien que FFmpeg présente d'autres avantages (dont le rendu temps réel utilisé pour du VJing) il faut avouer qu'on va vite tourner en rond avec cette seule commande.
Mais cette mise en bouche m'a donné envie de creuser un peu plus, et notamment de trouver des rendus visuels qu'After Effects ne permet pas d'obtenir ou du moins pas aussi spontanément.
Aperçu de l'effet Displacement Map de After Effects, on retrouve les paramètres similaires à ceux proposer par le Displace de FFmpeg
C'est avec cette idée en tête que j'ai commencé à me repencher sur le datamoshing, après tout quel meilleur moyen d'obtenir du glitch que de dégrader réellement le fichier en question ? Voyons voir où ça nous emmène.
Alors le datamoshing qu'est-ce que c'est ?
En recherchant des ressources sur le sujet je suis tombé sur un super article de l'association Labomedia qui le définit de la manière suivante :
C'est la déstructuration d'une vidéo en modifiant les repères temporels dans les paramètres d'encodage.
En clair, quand une vidéo est compressée en divx, il y a des images clefs disons toutes les secondes, ces images clefs (keyframe) contiennent toutes les infos (ou tous les pixels) pour reconstituer l'intégralité de l'image alors que les autres images (qui ne sont pas “keyframe”) ne contiennent qu'une partie de l'info (des pixels), c'est en partie comme cela qu'on “compresse” l'image, cad en ne stockant pas toutes les images intégralement dans le fichier vidéo.
et visuellement ça donne ça (une référence également piquée chez Labomédia) :
Au-delà de cette définition et ce clip je vous recommande vivement de faire un petit tour sur l'article qui liste tout un tas de références, outils et tutorials sur le sujet.
Ok on en sait un peu plus sur la théorie, voyons voir ce que ça donne en pratique. Pour ça j'ai utilisé Autodatamosh et suivi le tutoriel que je remets ci-dessous :
1. Préparer la vidéo, en la convertissant en avi :
ici avec un iframe toutes les 100 images (-g 100)ffmpeg -i input.mp4 -vcodec libxvid -qscale 1 -g 100 -me_method epzs -bf 0 -mbd 0 -aspect 16:9 out.avi
3. Exécuter le script.
La commande prend la forme suivante :
/autodatamosh.pl [-i FILE] [-o FILE] [-dprob N] [-dmin N] [-dmax N]
avec pour options :
-i FILE Input file. Default is stdin.
-o FILE Output file. Default is stdout.
-dprob N The probability (where N is between 0 and 1) that P-frames wilbe duplicated when an I-frame is removed, producing a sweeping effectDefault is 0.
-dmin N Minumum number of frames to be duplicated. The actual amounduplicated will vary randomly between this and the value of dmax. Defaulis 10.
-dmax N Maximum number of frames to be duplicated. The actual amounduplicated will vary randomly between this and the value of dmin. Defaulis 50.
ce qui donne donc :
/autodatamosh.pl -i input.avi -o output.avi -dprob .5 -dmin 5 -dmax 30
Essayons ça sur une vidéo, à noter que le résultat est à ouvrir avec VLC, qui indiquera sans doute que le fichier est endommagé (bingo) il suffit de lui indiquer de le lire « tel quel »
également on peut reconvertir le fichier en mp4 et garder le datamoshing :
ffmpeg -i datamoshed.avi datamoshed.mp4
et voilà le résultat :
Reel Datamoshé
Bon c'est pas mal, on s'éloigne d'un rendu 'After Effects' (bien que les plus perspicaces d'entre vous me diront qu'il existe des plugins dédiés au datamoshing).
Mais il faut avouer que l'esthétique datamoshing dans sa forme la plus basique n'est pas nouvelle, et sauf à travailler un rendu qui combine plusieurs techniques, comme c'est le cas par exemple dans certaines séquences du documentaire Ondes Noires d'Ismaël de Joffroy Chandoutis, on risque de tourner vite en rond.
(Je trouve d'ailleurs ce rendu assez intéressant, j'aimerais bien en savoir plus sur la manière dont elles ont été crées).
Ondes noires — Ismaël Joffroy Chandoutis
Combiner plusieurs techniques donc, transition toute trouvée vers la prochaine partie où on va se pencher sur les scripts FFmpeg.
Encore une fois, c'est via un post de Pixelflowers que je suis tombé sur un thread du forum Scanlines dédié à FFmpeg. Ce post liste tout un tas d'astuces et ressources parmi lesquels The FFmpeg Artschool, support d'un workshop proposé par AMIA Open Source qui fournit une trentaine de scripts ainsi qu'une explication pas à pas de la prise en main du terminal, l'installation de FFmpeg et l'utilisation des scripts en question.
Et, si j'ai structuré cet article dans l'ordre de mes propres découvertes, ce site peut également faire office de très bonne porte d'entrée.
L'effet rainbow-trails de FFmpeg Artschool et oioiiooixiii
Plutôt que de revenir sur chacun des scripts (je vous laisse pour ça lire la page dédiée de FFmpeg Artschool ou ma note perso) j'ai monté une vidéo compilant quelques-uns des résultats obtenus :
Reel avec différents filtres FFmpeg dont Rainbow-trail, Tblend, Echo
On avance dans notre quête, la combinaison de filtres permet d'obtenir des résultats plus singuliers. Mais comme tout outil créatif l'objectif ultime est plutôt de se les approprier pour en obtenir quelque chose de personnel.
C'est donc ce qu'on ca essayer de faire en écrivant un (petit) script.
Une limite à laquelle on va vite se heurter c'est le peu de connaissances et de pratiques que l'on a avec la syntaxe FFmpeg (pour le moment). On va donc partir sur quelque chose de relativement simple pour débuter.
Un peu dans la même veine que l'exploration réalisée sur ImageMagick, j'avais envie de voir ce que pourrait donner un effet de décalage de couche avec tremblement. Pour ça je découpe le processus en plusieurs étapes comme une recette, je vais avoir besoin de :
- Appliquer les teintes et stocker chaque calque en vue de les combiner.
- Appliquer le tremblement sur chacun des calques.
- Superposer les 3 calques avec un mode de fusion.
- Encoder le résultat
Voyons voir comment réaliser chacune de ces étapes :
D'abord on va appliquer une teinte sur un seul calque :
ffmpeg -i /path/reel.mp4 -filter_complex "[0:v]colorchannelmixer=1:2:2:0:2:2:0.9:0:0:0:1:-2[layer1]" -map "[layer1]" out.mp4
Qu'est-ce qu'il se passe ici ?
layer1
On obtient ceci :
et si on répète l'opération pour obtenir 3 couches :
ffmpeg -i /path/reel.mp4 -filter_complex "[0:v]colorchannelmixer=1:2:2:0:2:2:0.9:0:0:0:1:-2[layer1];[0:v]colorchannelmixer=-2:-2:0:0:-0.16:0.8:2:0:2:2:2:-0.1[layer2];[0:v]colorchannelmixer=2:0.6:0.6:0:-2:0:-1:0:-0.7:2:2:-0.1[layer3]; [layer1][layer2][layer3] hstack=inputs=3 [out]" -map "[out]" out.mp4
On utilise ici le filtre hstack
pour superposer horizontalement nos 3 couches et donc avoir un aperçu de chacune d'entre elle.
Voici le résultat :
ffmpeg -i /path/reel.mp4 -filter_complex "[0:v][0:v]overlay='random(1)*10+random(1)*(-10)':'random(1)*10+random(1)*(-10)',colorchannelmixer=1:2:2:0:2:2:0.9:0:0:0:1:-2[layer1];[0:v][0:v]overlay='random(1)*10+random(1)*(-10)':'random(1)*10+random(1)*(-10)',colorchannelmixer=-2:-2:0:0:-0.16:0.8:2:0:2:2:2:-0.1[layer2];[0:v][0:v]overlay='random(1)*10+random(1)*(-10)':'random(1)*10+random(1)*(-10)',colorchannelmixer=2:0.6:0.6:0:-2:0:-1:0:-0.7:2:2:-0.1[layer3];[layer1][layer2][layer3] hstack=inputs=3 [out]" -map "[out]" out.mp4
Pour ajouter un tremblement on utilise le filtre overlay qui permet de superposer 2 flux en spécifiant la valeur de décalage en x et y. En l’occurrence on va superposer la même vidéo en utilisant une valeur random.
(à noter que la valeur générée par le random(1)
est constante, il y a une histoire de seed mais je n'ai pas encore trouvé la syntaxe pour avoir des valeurs randoms différentes ce qui permettrait un peu plus de variations dans le tremblement)
ffmpeg -i /path/reel.mp4 -filter_complex "[0:v][0:v]overlay='random(1)*10':'random(1)*10',colorchannelmixer=1:2:2:0:2:2:0.9:0:0:0:1:-2[layer1];[0:v][0:v]overlay='random(1)*(-10)':'random(1)*(-10)',colorchannelmixer=-2:-2:0:0:-0.16:0.8:2:0:2:2:2:-0.1[layer2];[0:v][0:v]overlay='random(1)*10+5':'random(1)-5',colorchannelmixer=2:0.6:0.6:0:-2:0:-1:0:-0.7:2:2:-0.1[layer3];[layer1][layer2] blend=all_mode='difference'[out];[out][layer3] blend=all_mode='difference'[out2]" -map "[out2]" out.mp4
ici on utilise le filtre Blend
pour superposer nos calques 1 et 2 avec un mode de fusion, on enregistre le résultat dans un nouveau calque [out]
puis on répéte l'opération pour superposer [out]
et notre layer3
[layer1][layer2] blend=all_mode='difference'[out];[out][layer3] blend=all_mode='difference'[out2]" -map "[out2]" out.mp4
Dernière étape si on souhaite pouvoir réutiliser notre filtre facilement, l'enregistrer dans un script bash. Pour ça je reprends un des scripts de FFmpeg Artschool que j'essaye de modifier en y intégrant ma commande FFmpeg.
Le script pour Mac OS est téléchargeable ici : channelsplit.sh.zip
et désormais on peut l'appeler simplement avec :
/channelsplit.sh -s input.mp4
et le résultat :
Reel avec channelsplit.sh
Voilà pour cette petite prise en main de FFmpeg. Pour conclure cet article je vous propose une liste de toutes les ressources qui m'ont servis à l'écrire et qui devraient vous permettre de pousser plus loin si l'envie vous prend.
À dans 6 mois pour une prochaine lecture 👋
(j'ai ajouté un flux Atom et RSS à toute fin utile.)