Page 1 sur 2

Incrustation d'une image ou d'une video

Posté : lun. 29 août, 2011 19:34
par leon1789
Version du 09-07-2012

Voici une fonction avisynth Incrustation qui permet d'incruster soit une image, soit une petite vidéo, dans une video originale.

function Incrustation (clip video, clip "video2", string "image", int "opacite", int "x", int "y", int "larg", int "haut", int "depart", int "fin", float "fade", float "fadeIn", float "fadeOut", bool "verbose")

video désigne la video originale ;
video2 / image désigne la vidéo / image à incruster ;
opacite (entier entre 0 et 100) désigne l'opacité de l'incrustation ;
x, y indiquent la position de l'incrustation (coin supérieur gauche de l'objet incrusté) ;
larg, haut indiquent la largeur et la hauteur de l'incrustation ;
depart indique le numéro de l'image de la video originale à partir de laquelle l'incrustation commence ;
fin indique le numéro de l'image de la video originale à laquelle l'incrustation se termine ;
fade indique le nombre de secondes pendant lesquelles il y a fondu de l'incrustation (ouvrant et fermant) ;
fadeIn indique le nombre de secondes pendant lesquelles il y a fondu ouvrant de l'incrustation ;
fadeOut indique le nombre de secondes pendant lesquelles il y a fondu fermant de l'incrustation ;
verbose permet l'affichage des constantes du script.

Par défaut,
opacite = 100 : incrustation "totale" ;
x=0 et y=0 : l'incrustation est positionnée en haut à gauche de la video originale ;
larg et haut sont les dimensions initiales de l'objet incrusté ;
depart = 0 : l'incrustation commence tout de suite ;
fin = depart + longueur de la vidéo incrustée , ou , numéro de l'image de la video originale pour une dernière image incrustée ;
fade=0 , fadeIn=0 , fadeOut=0 : pas de fondu ;
verbose = false : pas d'affichage des constantes du script.

Le script avisynth : fichier Incrustation.zip ici http://leon1789.perso.sfr.fr/avisynth/

Exemple d'une incrustation d'une vidéo qui s'incruste à partir de l'image 100 jusqu'à l'image 400, sur une hauteur de 200 points (la largeur étant calculée automatiquement pour garder le bon aspect de la vidéo incrustée), avec des fondus entrant et sortant de 3.75 secondes :

Code : Tout sélectionner

video = aviSource("01.avi")
video2 = aviSource("Extrait.avi")
video = video.Incrustation(video2=video2, haut=200, depart=100, fin=400, fade=3.75)
Exemple d'incrustation (en haut à gauche) d'une image logo (qu'on ne redimensionne pas) au départ d'une video et jusqu'à son terme :

Code : Tout sélectionner

video.Incrustation(image="logo")
Exemple d'incrustation (en haut à gauche) d'une video logo (qu'on ne redimensionne pas) au départ d'un video et jusqu'à son terme (quitte à faire boucler la vidéo logo) :

Code : Tout sélectionner

video.Incrustation(video2=logo.loop)     # Bien mettre le ".loop"

Posté : lun. 29 août, 2011 19:41
par Underground78
Salut,

Je me suis permis de mettre le script sur pastebin, je trouve un peu complexe d'utiliser Megaupload pour un si petit fichier. ;)

Posté : lun. 29 août, 2011 20:03
par leon1789
oui, tu as bien fait ! :)

Posté : lun. 29 août, 2011 20:18
par pepsilite
Si je ne m'abuse, c'est un peu la même chose que l'incrustation de logo dans m4ng? (sauf qu'on peut incruster une vidéo et pas seulement une image)

Posté : lun. 29 août, 2011 21:20
par leon1789
Effectivement :)

Posté : ven. 14 oct., 2011 22:58
par pepsilite
Tu peux donner un exemple de code pour incruster une image?
[EDIT]J'ai trouvé, c'est bon :D
Sinon, il faut une image avec une résolution paire sinon message d'erreur. Ce serait bien d'ajouter une "parité" automatique pour la résolution. Comment spécifie-t-on qu'on veut que le "logo" soit incrusté indéfiniment?

Posté : sam. 15 oct., 2011 19:24
par leon1789
Exact, il faut une résolution paire (peut-être même multiple de 4 dans la largeur, je n'ai pas vérifié). Je vais voir ce que je peux faire.

Exemple d'incrustation (en haut à gauche) d'une image logo (qu'on ne redimensionne pas) au départ d'un film et jusqu'à sont terme :

Code : Tout sélectionner

film.Incrustation(image="logo")
Exemple d'incrustation (en haut à gauche) d'une video logo (qu'on ne redimensionne pas) au départ d'un film et jusqu'à sont terme (quitte à faire boucler la vidéo logo) :

Code : Tout sélectionner

film.Incrustation(video=logo.loop)     # Bien mettre le ".loop"

Posté : sam. 15 oct., 2011 19:33
par pepsilite
Pour image="logo", j'ai fini par trouver, sauf que c'est "chemin du logo" en fait.

"loop", je ne connaissais pas l'existence de cette instruction...
Merci.

Je suis en train de mettre au point une nouvelle fonctionnalité de m4ng et j'ai utilisé ton "incrustation" pour justement incruster un logo, ça ne te pose pas de souci?

Posté : sam. 15 oct., 2011 19:38
par pepsilite
"loop" est censé fonctionner avec une image aussi?
Je l'ai essayé et ça a carrément fait planter m4ng... Finalement si on ne met aucun départ ou fin, l'image reste indéfiniment, j'ai ma réponse ;)

Posté : sam. 15 oct., 2011 19:44
par leon1789
pepsilite a écrit :Pour image="logo", j'ai fini par trouver, sauf que c'est "chemin du logo" en fait.

"loop", je ne connaissais pas l'existence de cette instruction...
Merci.

Je suis en train de mettre au point une nouvelle fonctionnalité de m4ng et j'ai utilisé ton "incrustation" pour justement incruster un logo, ça ne te pose pas de souci?
aucun souci.
Fais attention aux différents FPS entre le film et la vidéo incrustée. ;)

Posté : sam. 15 oct., 2011 19:50
par pepsilite
Ben pour l'instant, j'incruste une image, pas une vidéo ... mais ça fait quoi en fait? ça joue tout au FPS de la vidéo principale?

Posté : sam. 15 oct., 2011 19:51
par leon1789
pepsilite a écrit :"loop" est censé fonctionner avec une image aussi?
Loop agit sur des vidéos qui ont moins de 10 000 000 d'images (sans rire :) )

Posté : sam. 15 oct., 2011 19:51
par pepsilite
leon1789 a écrit :Exact, il faut une résolution paire (peut-être même multiple de 4 dans la largeur, je n'ai pas vérifié). Je vais voir ce que je peux faire.

Ben c'est simple tu divises les résolutions par 4 et tu les remultiplies par 4... Ça fera pile poil ce qu'il faut

Posté : sam. 15 oct., 2011 19:53
par pepsilite
leon1789 a écrit :
pepsilite a écrit :"loop" est censé fonctionner avec une image aussi?
Loop agit sur des vidéos qui ont moins de 10 000 000 d'images (sans rire :) )
Et au dessus de 10.000.000 on fait comment? :kes:

Posté : sam. 15 oct., 2011 19:53
par leon1789
pepsilite a écrit :mais ça fait quoi en fait? ça joue tout au FPS de la vidéo principale?
Oui, il faut que le script fasse une convertion (convertFPS ou changeFPS) pour que le FPS de la vidéo inscrustée vienne coller avec celui du film principal.

Pour incruster une image, pas de souci, car ImageReader fait le travail (on lui précise directement le FPS du film)

Posté : sam. 15 oct., 2011 19:55
par pepsilite
leon1789 a écrit :
pepsilite a écrit :mais ça fait quoi en fait? ça joue tout au FPS de la vidéo principale?
Oui, il faut que le script fasse une convertion (convertFPS ou changeFPS) pour que le FPS de la vidéo inscrustée vienne coller avec celle du film.
Pourquoi tu n'ajoutes pas une entrée FPS= à la fonction? ça se ferait tout seul ensuite ...

Posté : sam. 15 oct., 2011 20:27
par leon1789
Baf, pas la peine que l'utilisateur s'embête à préciser le FPS puisque le script peut le connaître tout seul.

Posté : sam. 15 oct., 2011 20:50
par pepsilite
C'est aussi ce que je me disais, mais bon :D

Posté : dim. 16 oct., 2011 12:30
par leon1789
pepsilite a écrit :
leon1789 a écrit :Exact, il faut une résolution paire (peut-être même multiple de 4 dans la largeur, je n'ai pas vérifié). Je vais voir ce que je peux faire.
Ben c'est simple tu divises les résolutions par 4 et tu les remultiplies par 4... Ça fera pile poil ce qu'il faut
En fait, je faisais déjà cette opération... mais bêtement trop tard dans le script !
Il suffit de déplacer les deux lignes

Code : Tout sélectionner

21.  film = film.ConvertToYV12
22.  video = video.ConvertToYV12.KillAudio
en les mettant en ligne 35, après

Code : Tout sélectionner

34.  video = video.LanczosResize(L,H)

Posté : dim. 16 oct., 2011 13:16
par pepsilite
C'est bon, ça marche avec une image à résolution impaire...

Posté : lun. 09 juil., 2012 16:40
par Subbat
Histoire de ne pas polluer le sujet de oliver_s...
leon1789 a écrit :Effectivement, c'est pas cool que "video" ne désigne pas la même chose.
Comment appeler les deux premiers arguments de Incrustation : "video" pour la vidéo principale, et "video2" pour l'inscrustée ?
Bah en même temps ça semble fonctionner... mais sinon pourquoi ne pas simplement laisser "petite_video"... et du coup, tu ne serais peut-être plus obligé de mettre "video.incrustation(video=petite_video,...)" par "video.incrustation(petite_video,...)" non ?

Après à la place de petite_video, que ce soit video2 ou video_incrust ou que sais-je c'est pas grave... mais ce que je ne comprend pas c'est ce passage par video=petite_video...

Posté : lun. 09 juil., 2012 16:48
par Subbat
Bon si j'avais pris le temps de regarder ton avsi, j'aurais compris... du coup, effectivement, remplacer film par video et video par video2 pourrait être bien je trouves... et du coup je pense que tu n'aurais plus à mettre le video=petite_video si je ne me trompes pas...

Bon le hic, c'est si je ne m'abuse tu utilises film dans tous tes scripts toi... Tu devrais peut-être te mettre à utiliser video à la place... d'autant que pour faire multilingue video c'est idem en français et en anglais... alors que film, c'est plutôt movie en anglais... :mrgreen:

Posté : lun. 09 juil., 2012 17:12
par leon1789
Bon ben c'est changé (dans le script et les commentaires) : video, video2 à la place de film, video !

Posté : lun. 09 juil., 2012 17:23
par Subbat
Trop fort leon... mais alors pourquoi faut-il laisser le "video2=video2, ..." sur la ligne "video = video.Incrustation(video2=video2, haut=200, depart=100, fin=400, fade=3.75)"

Posté : lun. 09 juil., 2012 18:03
par leon1789
video.incrustation(video2=video2, ...).

Le "video2" du membre gauche de l'égalité désigne le nom de la variable utilisée à l'intérieure du script pour désigner la vidéo incrustée,
alors que le "video2" du membre de droite de l'égalité désigne le nom de la variable utilisée à l'extérieure du script pour désigner la vidéo incrustée.


A l'extérieur du script, l'utilisateur a tout le loisir de nommer comme il le souhaite la vidéo à incruster : par exemple, "ma_petite_video_a_inscruster".
En revanche, pour faire passer l'information au script d'incrustation, il faut se mettre sur la longueur d'onde du script en précisant obligatoirement l'argument "video2=..."
D'où "video2 = ma_petite_video_a_inscruster".


Mais si l'utilisateur a choisi lui-même de nommer à l'extérieur du script sa vidéo à incruster par "video2", alors l'instruction devient "video2 = video2" (ce qui peut surprendre, mais qui montre surtout une cohérence entre l'extérieur et l'intérieur du script).

Bon, beaucoup de blabla pour pas grand chose en fait :mrgreen:



Une dernière chose, le paramètre "video2=..." n'est obligatoire que lorsqu'on veut incruster une video, sinon on utilise "image=..." qui précise une image à incruster. Seul un des deux paramètres "video2 / image" doit être utilisé.