La semaine dernière, j'ai reçu un mail de Jean-Luc G., qui, au vu des nombreux articles sur FFMPEG que j'ai sur mon site, me demander si je savais faire une pyramide holographique.
Dans un premier temps, mon lecteur m'a expliqué ce que c'était car je l'ignorais totalement. À l'aide du peu de connaissance que j'ai sur Youtube FFMPEG, ainsi que ses recherches de son côté, nous avons commencé à regarder comment faire ce genre de montage vidéo. Mon travail s'est arrêté relativement et rapidement car premièrement je connaissais mal ce genre de montage holographique d'une part mais nous avons réfléchi ensemble et je lui ai expliqué comment moi j'aurais décomposé la chose pour arriver à ses fins. J'ai reçu dimanche dernier un mail de sa part m'explicant qu'il y avait réussi à faire ce montage, et comme je lui avais proposé d'écrire un article sur le sujet pour mes lecteurs qui seraient éventuellement intéressés, il a eu la gentillesse de me renvoyer toute un article complet que je vais vous partager. Encore une fois, le travail n'est pas de moi, et son article est extrêmement détaillé. Nous le remercions.
Enfin, ce tutoriel s'appliique aux videos de type hologram. Vous en trouverez sous Youtube avec notament les mentions "3D Hologram For Pyramid 4 faces Screen Down" par exemeple

La vidéo d’origine est au format webm (je l’ai renommée «lac_des_cygnes.webm») et elle mesure 360 x 360 px (c’est un carré). Elle est de type « screen up » car destinée à être jouée par un moniteur dont l’écran est tourné vers le haut : le moniteur est situé sous une pyramide holographique inversée donc sous une pyramide dont la pointe est orientée vers le bas et par conséquent vers l’écran. Les personnages ont tous leur tête orientée vers l’extérieur de la vidéo :

JLG1

 

 Ce que l’on veut, c’est obtenir la même vidéo mais au type « screen down », c’est à dire une vidéo jouée par un moniteur dont l’écran est tourné vers le bas. Dans ce cas, le moniteur est situé au-dessus d’une pyramide holographique dont la pointe est normalement orientée vers le haut. Ici, la tête des personnages est orientée vers le centre de la vidéo comme ci-dessous :

 JLG2

 Sur la photo « screen up », on remarque d’emblée qu’il est physiquement impossible de se contenter de remplacer chaque ballerine par son image-miroir car, dans ce cas, leurs bras se chevaucheraient au centre de la vidéo…

Seule solution possible :

  • réduire la taille des ballerines de gauche et de droite (à 75%) puis les remplacer par leurs images-miroir horizontales respectives ;
  • remplacer les deux autres ballerines (celles du haut et du bas) par leurs images-miroir verticales respectives.

C’est le résultat affiché dans la photo ci-dessus.

Pour y parvenir, il est important de respecter l’ordre des modifications :

  • d’abord réduire la taille des ballerines de gauche et de droite puis les remplacer par leur image-miroir horizontale ;
  • et seulement après, remplacer les ballerines du haut et du bas par leur image-miroir verticale (cette fois, sans réduction de leur taille).

On utilise le filtre « drawbox » du logiciel FFMPEG . Celui-ci permet d’inscrire une danseuse dans un rectangle. Il ne reste plus ensuite qu’à remplacer l’image inscrite dans ce rectangle par son image-miroir horizontale.

Ballerine de gauche :
Pour pouvoir utiliser le filtre drawbox dans une ligne de commande unique, il faut d’abord déterminer les coordonnées x:y:w:h à renseigner dans ce filtre.

Coordonnées x :y :w :h à renseigner dans drawbox

Dans le filtre « drawbox », chaque rectangle est défini par 4 coordonnées :
- x et y pour situer le rectangle sur la surface de la vidéo (x=0,y=0 désignant le coin supérieur gauche de la vidéo) ;
- w et h pour préciser la taille du rectangle (w pour largeur et h pour hauteur).

Bien sûr, il faut tâtonner avant de trouver les bonnes valeurs pour les coordonnées du filtre « drawbox ». Dans mon cas, les coordonnées étaient les suivantes :

  • drawbox sur la danseuse de gauche : x=0:y=100:w=145:h=160
  • drawbox sur la danseuse de droite : x=215:y=100:w=145:h=160
  • drawbox sur la danseuse du bas : x=100:y=210:w=160:h=160
  • drawbox sur la danseuse du haut : x=100:y=0:w=160:h=160

Comment obtenir les coordonnées x:y:w:h de drawbox

On s’aide en superposant un rectangle rose semi-transparent au-dessus de chaque ballerine à masquer. Comme c’est semi-transparent, on peut plus facilement voir comment modifier les coordonnées pour que le rectangle rose soit correctement superposé à la ballerine.

La ligne de commande à utiliser pour chaque rectangle rose semi-transparent est la suivante (ci-dessous, c’est pour la ballerine de gauche) :

ffmpeg -i lac_des_cygnes.webm -vf "drawbox=x=0:y=100:w=145:h=160:color=pink@0.5:t=max" ballerine_de_gauche_en_rose.webm

 (attention, dans les versions récentes de FFMPEG il faut remplacer « max » par « fill »).

 On obtient cette vidéo :

 JLG3

 Il faut maintenant diminuer la taille de ce rectangle de 75 %, c’est à dire le réduire aux dimensions w =109 px et h= 96 px. Cette réduction doit se faire en conservant les coordonnées x. Par contre, il faut que les coordonnées de y soient adaptées : après réduction y = 126.

ffmpeg -i lac_des_cygnes.webm -filter_complex "[0:v]crop=145:160:0:100,scale=w=96:h=109:force_original_aspect_ratio=decrease[small];[0:v]scale=w=360:h=360[bg];[bg][small]overlay=0:((360-109)/2)[out]" -map "[out]" -map 0:a -c:a opus -b:a 128k -strict -2 ballerine_gauche_réduite.webm

On obtient cette vidéo :

 JLG4

Il faut maintenant remplacer ce rectangle par son image miroir horizontale :

ffmpeg -i ballerine_gauche_réduite.webm -filter_complex "[0:v]crop=96:109:0:126[rect];[rect]hflip[rect_flip];[0:v][rect_flip]overlay=0:126" -c:v libvpx-vp9 ballerine_gauche_réduite_miroir.webm

On a donc bien l’image-miroir horizontale de la ballerine (la tête est bien dirigée vers le centre de la vidéo).

 

Problème : cette image-miroir (au format réduit 109 x 96 pixels) est superposée à l’image d’origine (au format 160 x 145 pixels) de la ballerine. Il y a donc des reliquats de l’image d’origine autour de l’image réduite. Six en tout pour être précis.
Il faut donc masquer tous les reliquats par des drawbox opaques noires aux bonnes dimensions.
Cela nécessite de connaître les dimensions et coordonnées de chacun des reliquats. Pour cela, on recourt temporairement et comme précédemment à des drawbow roses semi-transparentes.

Voici l’ensemble des reliquats individualisés sur la vidéo :

 JLG5

 

Dans mon cas particulier, les coordonnées et dimensions des 6 rectangles roses sont les suivantes :

  • x=0:y=100:w=50:h=45
  • x=0:y=100:w=20:h=70
  • x=0:y=190:w=28:h=90
  • x=0:y=230:w=100:h=30
  • x=96:y=160:w=50:h=45
  • x=96:y=150:w=10:h=10

 Une fois les coordonnées et dimensions déterminées, on remplace toutes les drawbox roses par des drawbox noires opaques.
Cela peut être fait en une seule ligne de commande :

ffmpeg -i ballerine_gauche_réduite_miroir.webm -filter_complex "[0:v]drawbox=x=0:y=100:w=50:h=45:color=black@1.0:t=max[bg1]; [bg1]drawbox=x=0:y=100:w=20:h=70:color=black@1.0:t=max[bg2];
[bg2]drawbox=x=0:y=190:w=28:h=90:color=black@1.0:t=max[bg3];
[bg3]drawbox=x=0:y=230:w=100:h=30:color=black@1.0:t=max[bg4];
[bg4]drawbox=x=96:y=160:w=50:h=45:color=black@1.0:t=max[bg5];
[bg5]drawbox=x=96:y=150:w=10:h=10:color=black@1.0:t=max[out]" -map "[out]" -c:a copy ballerine_gauche.webm

et comme il n’y a plus de son dans la vidéo de sortie, on ré-encode le flux audio en remplaçant -c:a copy par -map 0:a -c:a opus -b:a 128k -strict -2 à la ligne de commande ci-dessus, ce qui donne :

ffmpeg -i ballerine_gauche_réduite_miroir.webm -filter_complex "[0:v]drawbox=x=0:y=100:w=50:h=45:color=black@1:t=max[bg1]; [bg1]drawbox=x=0:y=100:w=20:h=70:color=black@1:t=max[bg2];
[bg2]drawbox=x=0:y=190:w=28:h=90:color=black@1:t=max[bg3];
[bg3]drawbox=x=0:y=230:w=100:h=30:color=black@1:t=max[bg4];
[bg4]drawbox=x=96:y=160:w=50:h=45:color=black@1:t=max[bg5];
[bg5]drawbox=x=96:y=150:w=10:h=10:color=black@1:t=max[out]" -map "[out]" -map 0:a -c:a opus -b:a 128k -strict -2 ballerine_gauche.webm

Voici la vidéo finale «ballerine_gauche.webm» que l’on obtient :

 JLG6

Ballerine de droite:

Pour cette seconde ballerine, on recommence toutes les opérations déjà faites pour la ballerine de gauche. Pour inscrire la ballerine de droite dans un rectangle de drawbox rose semi-transparent, on utilise la ligne de commande suivante :

ffmpeg -i ballerine_gauche.webm -vf "drawbox=x=215:y=100:w=145:h=160:color=pink@0.5:t=max" ballerine_droite_en_rose.webm

(attention, dans les versions récentes de FFMPEG il faut remplacer « max » par « fill »).

On obtient cette vidéo :

 JLG7

Il faut ensuite diminuer la taille de ce rectangle de 75 %, c’est à dire le réduire aux dimensions w =109 px et h= 96 px.
Cette réduction doit se faire en adaptant les coordonnées x et y :
- après réduction, x = 265 ;
- après réduction, y = 126.

ffmpeg -i ballerine_gauche.webm -filter_complex "[0:v]crop=145:160:215:100,scale=w=96:h=109:force_original_aspect_ratio=decrease[small];[0:v]scale=w=360:h=360[bg];[bg][small]overlay=265:((360-109)/2)[out]" -map "[out]" -map 0:a -c:a opus -b:a 128k -strict -2 ballerine_droite_réduite.webm

On obtient cette vidéo :

 JLG8

 On remplace maintenant ce rectangle par son image miroir horizontale :

ffmpeg -i ballerine_droite_réduite.webm -filter_complex "[0:v]crop=96:109:265:126[rect];[rect]hflip[rect_flip];[0:v][rect_flip]overlay=265:126" -c:v libvpx-vp9 ballerine_droite_réduite_miroir.webm

On obtient cette vidéo :

 JLG9

 

Comme pour la ballerine de gauche, Il faut maintenant masquer les reliquats de la danseuse du rectangle d’origine. Cela nécessite de connaître les dimensions et coordonnées de ces reliquats.

L’utilisation temporaire de drawbow roses semi-transparentes permet de déterminer plus facilement ces données chiffrées.

Voici l’ensemble des reliquats individualisés sur la vidéo :

 JLG10

 Dans mon cas particulier, les coordonnées et dimensions des 6 rectangles roses sont les suivantes :

drawbox=x=263:y=81:w=65:h=45
drawbox=x=330:y=120:w=30:h=50
drawbox=x=330:y=190:w=30:h=50
drawbox=x=260:y=230:w=70:h=40
drawbox=x=214:y=160:w=50:h=50
drawbox=x=254:y=150:w=10:h=10

 Une fois les coordonnées et dimensions déterminées, on remplace toutes les drawbox roses par des drawbox noires opaques.
Cela peut être fait en une seule ligne de commande :

ffmpeg -i ballerine_droite_réduite_miroir.webm -filter_complex "[0:v]drawbox=x=263:y=81:w=65:h=45:color=black@1:t=max[bg1]; [bg1]drawbox=x=330:y=120:w=30:h=50:color=black@1:t=max[bg2];
[bg2]drawbox=x=330:y=190:w=30:h=50:color=black@1:t=max[bg3];
[bg3]drawbox=x=260:y=230:w=70:h=40:color=black@1:t=max[bg4];
[bg4]drawbox=x=214:y=160:w=50:h=50:color=black@1:t=max[bg5];
[bg5]drawbox=x=254:y=150:w=10:h=10:color=black@1:t=max[out]" -map "[out]" -c:a copy ballerine_droite.webm

 et comme il n’y a plus de son dans la vidéo de sortie, on ré-encode le flux audio en remplaçant -c:a copy par -map 0:a -c:a opus -b:a 128k -strict -2 à la ligne de commande ci-dessus, ce qui donne :

ffmpeg -i ballerine_droite_réduite_miroir.webm -filter_complex "[0:v]drawbox=x=263:y=81:w=65:h=45:color=black@1:t=max[bg1]; [bg1]drawbox=x=330:y=120:w=30:h=50:color=black@1:t=max[bg2];
[bg2]drawbox=x=330:y=190:w=30:h=50:color=black@1:t=max[bg3];
[bg3]drawbox=x=260:y=230:w=70:h=40:color=black@1:t=max[bg4];
[bg4]drawbox=x=214:y=160:w=50:h=50:color=black@1:t=max[bg5];
[bg5]drawbox=x=254:y=150:w=10:h=10:color=black@1:t=max[out]" -map "[out]" -map 0:a -c:a opus -b:a 128k -strict -2 ballerine_droite.webm

Et voici la vidéo finale «ballerine_droite.webm» que l’on obtient :

 JLG11

Les deux ballerines de gauche et de droite sont bien de taille réduite (de 75%) et leur tête est désormais orientée vers le centre de la vidéo.

 

Remplacer les ballerines du haut et du bas par leur image-miroir verticale

Là encore, nous utiliserons le filtre « drawbox » du logiciel FFMPEG.

Ballerine du haut

On commence par déterminer les coordonnées et les dimensions du rectangle «drawbox» dans lequel s’inscrit la ballerine du haut.
Cette opération est facilitée par le recours à un fond rose semi-transparent

Dans mon cas, les coordonnées étaient les suivantes drawbox sur la ballerine du haut: : x=100:y=0:w=160:h=160

Et pour remplacer la ballerine par son image-miroir verticale, on utilise cette ligne de commande :

ffmpeg -i ballerine_droite.webm -filter_complex "[0:v]crop=160:160:100:0[rect];[rect]vflip[rect_flip];[0:v][rect_flip]overlay=100:0" -c:v libvpx-vp9 ballerine_du_haut_miroir.webm
On obtient cette vidéo :

 JLG12

Ballerine du bas

En s’aidant d’une drawbox à fond rose semi-transparent, on détermine les coordonnées et les dimensions du rectangle dans lequel s’inscrit la ballerine.

Dans mon cas, les données chiffrées sont les suivantes : drawbox sur la ballerine du bas : x=100:y=210:w=160:h=160

Et pour remplacer la ballerine par son image-miroir verticale, on utilise cette ligne de commande :

ffmpeg -i ballerine_du_haut_miroir.webm -filter_complex "[0:v]crop=160:160:100:210[rect];[rect]vflip[rect_flip];[0:v][rect_flip]overlay=100:210" -c:v libvpx-vp9 ballerine.webm

Et on obtient cette vidéo finale «ballerine.webm» :

 JLG13


L'auteur de ce tutoriel, a fait encore mieux que de nous écrire un tuto, il nous a envoyé son résultat :