le boxon de Lex

[ Tutoriel ] Les effets dans AviSynth

J'ai déjà présenté ce qu'était AviSynth.
J'ai aussi donné des solutions pour générer de tels scripts, notamment lorsque l'on veut créer des vidéos ou des webms. Toutefois, il n'est pas rare que l'on souhaite appliquer un traitement ou un effet dans nos vidéos. Cette page vous en présente quelques-uns.

Attention, c'est de l'AviSynth pur, mais vous pouvez prévisualiser le rendu de ces effets dans AvsPmod.

Le recadrage

Il n'est pas rare que l'on souhaite recadrer une vidéo. Je le fais quasiment partout. Sur la TNT, il est fréquent que subsistent des bandes noires ici et là sur les bords.

Il suffit de rajouter le texte Crop( gauche, haut, - droite, - bas ) dans l'éditeur. Exemple : Crop( 4, 4, -4, 0 ) enlèvera 4 pixels à gauche, 4 en haut, 4 à droite, et aucun en bas. Attention, il faut 4 valeurs, et les deux dernières doivent être négatives.

Attention (bis) : les codecs ont des impératifs en termes de proportions. La largeur de la vidéo doit être un multiple de 4. Autrement dit, la somme de ce que vous enlevez à droite et à gauche doit être un multiple de 4. Pour la verticale, il faut que ce soit un multiple de 2 (un nombre pair donc). Vous auriez donc le droit d'écrire Crop( 2, 1, -6, -3 ), mais pas Crop( 2, 1, -0, 0 ). En effet, 2 et 6 font 8 = 4 x 2. 1 et 3 font 4 = 4 x 1. Mais 2 et 0 ne donnent pas un multiple de 4. Pas plus que 1 n'est un multiple de 2.

Dans AvsPmod, vous pouvez avoir un aperçu du recadrage en allant dans le menu Vidéo > Editeur rognage. N'hésitez pas à créer un raccourci pour cette macro dans les options de AvsPmod (personnellement, je lui ai attribué la lettre E).

ext - effets crop

Redimensionnement

Il peut parfois être utile de redimensionner une vidéo. On va généralement éviter d'agrandir une vidéo (cela revient à faire un zoom, et donc à créer des pixels, qui aboutiront à un effet de flou). Par contre, on peut raccourcir une des proportions. Par exemple, certaines chaînes sur les boxes internet arrivent dans une résolution de 1440 x 1280 pixels. Cela ne correspond pas à du 16/9.

Il existe plusieurs algorithmes de redimensionnement, mais le meilleur est Lanczos. Pour redimensionner une vidéo, vous pouvez donc rajouter dans votre script LanczosResize( 1280, 720 ). Le premier paramètre correspond à la nouvelle largeur. Le deuxième, à la nouvelle hauteur. Comme indiqué précédemment, la largeur doit être un multiple de 4, et la hauteur un multiple de 2.

Généralement, on procède au redimensionnement après avoir recadré la vidéo. Mais il peut y avoir des exceptions. Veillez à conserver un rapport d'aspect correct dans tous les cas.

Modification de l'éclairage ou du contraste

Certaines vidéos ou scènes sont parfois trop sombres.
On peut les éclaircir (ou les assombrir) avec l'instruction Tweak.

Exemple : Tweak( bright=0.5, cont=1.04 ) permet d'éclaircir une vidéo. Vous pouvez jouer avec les paramètres et voir l'effet sur le rendu final. Encore une fois, AvsPmod et la touche F5 sont vos amis.

Ralenti

On peut créer un effet de ralenti en jouant sur le FPS.
En le réduisant, le nombre d'images affichées chaque seconde va diminuer et les choses vont défiler plus lentement. A l'inverse, en l'augmentant, on accélère le cours de la vidéo. Utilisez AssumeFPS( 15.0 ) par exemple pour faire comme si le FPS de passait de 25 à 15 images par secondes.

AssumeFPS feint modifier le FPS.
ChangeFPS le modifie réellement.

Inverser le cours d'une vidéo

Il est possible d'inverser le cours d'une vidéo.
Le plus simple est d'isoler la scène dans une variable.

a = Trim( 0, 170 )
reverse( a )

Quand vous lirez la vidéo, elle commencera par la trame 170 et poursuivra jusqu'à celle qui était la numéro 0.

Coller plusieurs scènes

Comme vous venez le voir, il est possible de regrouper des scènes dans une variable. On peut coller ces scènes ensemble (pour qu'elles se succèdent) grâce à l'opérateur ++. Reprenons notre exemple précédent et faisons en sorte que notre vidéo boucle. La scène se déroule normalement. Une fois au bout, elle doit repartir en marche arrière.

a = Trim( 0, 170 )
b = reverse( a )
a ++ b

Que l'on peut aussi synthétiser en...

a = Trim( 0, 170 )
a ++ reverse( a )

Coller plusieurs vidéos

Nous avons vu comment coller deux scènes ensemble.
Il est aussi possible de coller deux vidéos ensemble, à condition qu'elles aient la même résolution (attention si vous avez recadré une vidéo) et le même FPS. Si vos deux vidéos sont définies dans deux fichiers AviSynth distincts, il vous suffit d'en créer un troisième et d'y mettre le contenu suivant...

Import( "mon-avs1.avs" ) ++ Import( "mon-avs-2.avs" )

Si les fichiers ne sont pas dans le même répertoire...

Import( "C:\chemin\vers\mon-avs1.avs" ) ++ Import( "C:\chemin\vers\ailleurs\mon-avs-2.avs" )

J'ai donné l'exemple avec 2 vidéos / fichiers, mais vous pouvez en mettre autant que vous le souhaitez.

Jouer un passage en boucle

Supposons qu'au milieu d'une scène, il y ait une séquence que vous souhaitiez répéter. Vous pouvez alors utiliser l'instruction Loop.

Loop( 2, 20, 25 )

Sur cet exemple, les trames 0 à 19 sont jouées normalement.
La séquence de trames 20 à 25 est jouée une première fois. Puis elle est rejouée une deuxième fois. Enfin, la fin de la vidéo est jouée normalement.

Prenons un autre exemple.

Loop( 5, 50, 125 )

Ici, tout est joué normalement, à l'exception d'une séquence (qui va des trames 50 à 125), et qui sera répétée 5 fois.

Faire un arrêt sur image dans la vidéo

C'est ici une variante de l'effet précédent.
Plutôt que de répéter une séquence, on souhaite répéter l'affichage d'une trame précise pendant un temps donné, ce qui donne l'effet d'un arrêt sur image lors de la lecture de la vidéo.

Voyons un premier exemple.

Loop( 50, 20, 20 )

Les trames 0 à 19 sont jouées normalement.
Puis la trame 20 va être répétée 50 fois. Cela peut paraître beaucoup, mais avec un framerate de 25 fps (c'est à dire qu'une seconde de vidéo correspond à 25 images), alors cet arrêt sur image durerait 2 secondes. Pour qu'il se prolonge durant 3 secondes, il faudrait mettre 75.

Prenons un exemple plus complexe.
Ici, la séquence est lue normalement, puis on fait un arrêt sur image de 3 secondes, et enfin, on rejoue la séquence, mais en marche arrière. On écririons alors...

sc = Trim( 0, 180 )
sc.Loop( 75, 150, 150 ) ++ reverse( sc )

Inverser droite et gauche

ext - effets inverser droite et gauche

a = Trim( 0, 170 )
FlipHorizontal( a )

Inverser haut et bas

ext - effets inverser haut et bas

a = Trim( 0, 170 )
FlipVertical( a )

Mettre des scènes côte à côte

ext - effets cote à cote

a = Trim( 0, 170 )
b = FlipHorizontal( a )
StackHorizontal(a, b)

Ici, j'ai créé un effet miroir, mais vous pouvez accoler des vidéos différentes, pourvu qu'elles aient les mêmes dimensions et le même FPS.

Mettre des scènes l'une au-dessus de l'autre

ext - effets miroir

a = Trim( 0, 170 )
b = FlipVertical( a )
StackVertical(a, b)

Ici, j'ai créé un effet miroir, mais vous pouvez empiler des vidéos différentes, pourvu qu'elles aient les mêmes dimensions et le même FPS.

Superposer deux scènes

Je l'ai utilisé une seule fois, pour faire un test.
Vous allez superposer deux images et jouer sur la transparence de l'une d'entre elles. On utilise pour cela l'instruction overlay.

a = Crop(940, 340, -400, -400)
b = FlipHorizontal(a)
a.Overlay(b, x=0, y=0, opacity=0.5, mode="blend")

ext - effets superposition

Mon exemple n'est pas très joli, mais vous comprenez l'idée.
Dans la pratique, je vous conseille de placer vos deux clips dans des scripts distincts, et d'en faire un troisième pour la superposition.

a = Import( "mon-avs1.avs" )
b = Import( "mon-avs1.avs" )
a.Overlay(b, x=0, y=0, opacity=0.5, mode="blend")

L'opacité doit varier entre 0 et 1. Il y a d'autres modes que blend, vous pouvez vous amuser avec les autres.

Déplacement de la caméra

C'est l'effet le plus compliqué.
Quand vous voulez ne pas poster toute l'image, mais que votre sujet se déplace, il faut que le cadre suive votre sujet. Je vous donne un exemple dans lequel j'ai dû compenser un mouvement de la caméra (la vraie, celle qui filmait).

Pour faire cela, il faut triturer un peu la vidéo.
D'abord, identifier à partir de quand la caméra doit se déplacer et quand elle doit se fixer. Ce que l'on fait, c'est un recadrage, mais qui va se mettre à bouger à un moment donné et s'arrêter un peu plus tard.

a = Trim( 0, 170 )
a = a.ConvertToRGB32()
a = Animate(a, 0, a.framecount(), "crop",
\ 600, 0, -280, -0,
\ 680, 0, -200, -0).ConvertToYV12()

Je décrypte un peu ce machin-là.
Le trim, vous connaissez, cela délimite le début et la fin d'une scène. La conversion du mode de couleurs est obligatoire pour ce que l'on veut faire. Animate est l'instruction-clé. Elle exécute un crop (recadrage) à partir de la trame 0 jusqu'à la fin de la scène (a.framecount() compte le nombre de trames dans la scène a). La valeur de recadrage est définie ensuite. La première ligne donne le recadrage au début (à la trame 0). La dernière ligne donne sa valeur pour le numéro de trame final. Enfin, on rétablit le mode de couleurs original. Les anti-slashes (\) servent à écrire une instruction trop longue sur plusieurs lignes.

Je vous donne un autre exemple.

a = Trim( 0, 170 )
a = a.ConvertToRGB32()
a = Animate(a, 17, 40, "crop",
\ 600, 0, -280, -0,
\ 680, 0, -200, -0).ConvertToYV12()

Des trames 0 à 17, inclus, le recadrage porte sur la zone (600, 0, -280, -0). A partir de la trame 40, elle est délimitée par les valeurs (680, 0, -200, -0). Et entre 17 et 40, la caméra / le cadre va bouger pour atteindre la valeur qu'il est censé prendre à la trame 40.

Si les mouvements de caméra sont complexes, alors il vous faudra découper la grande scène en plusieurs petites scènes, et traiter chaque sous-scène de cette manière. A la fin, vous les recollerez avec l'opérateur ++.



Aucune Réponse

N'hésitez pas à laisser un commentaire grâce au formulaire ci-dessous.
Avant de m'informer qu'un lien « videos.le-boxon-de-lex.fr » est mort, merci de vérifier que vous ne téléchargez qu'une vidéo à la fois.

Laisser une réponse