Bases de AVISYNTH

AVISYNTH est un langage puissant de programmation pour l'édition et le traitement de la vidéo. Il s'agit de créer un script AVISYNTH (extension .avs) utilisable par d'autres applications (telles que VirtualDub ou HC encoder) contenant l'ensemble des transformations à effectuer sur une vidéo (redimensionnement par exemple).

Pour commencer, installer la dernière version de AVISYNTH (supérieure à 2.5).
Pour écrire un script AVISYNTH le Notepad de Windows suffit.
L’éditeur officiel est AVSedit mais je vous conseille d’utiliser plutôt AVSP qui permet une prévisualisation des opérations effectuées sur la vidéo. Notez qu'il existe d'autres logiciels d'édition tels que Avisyntheditor, AVSGenie, FilmCutter, ScriptWriter…

Pour appliquer des effets à une vidéo, AVISYNTH nécessite l'utilisation de plugins relatifs à certaines fonctions. Il existe au moins 3 façons de charger les plugins en fonction de l'origine du plugin :
- pour charger un plugin de type AVISYNTH, on utilise la fonction LoadPlugin(plugin_a_charger.dll).
- pour charger un plugin de type C, on utilise la fonction LoadCplugin(plugin_a_charger.dll)
- pour charger un plugin de type VirtualDub, on utilise la fonction LoadVirtualdubPlugin("plugin_a_charger.vdf")

Une fois le plugin chargé, on peut ensuite utiliser la fonction relative au plugin, qui est spécifique pour chaque plugin.

Dans cet article, nous allons voir comment retravailler une vidéo mpeg2, issue par exemple d'un enregistrement TV. Ici, le premier plugin à utiliser est l'import de la vidéo MPEG2. Pour ce faire, on utilise DGDecode.dll disponible dans le programme DGMPGDEC. Ce programme permet aussi la création de projets .d2v et l'extraction de l'audio du MPEG2. D'ailleurs la fonction associée à ce plugin nécessite de charger un projet d2v, crée par le biais de DGMPGDEC à partir du MPEG2.

Ainsi pour charger la partie vidéo de "movie.mpg" on utilise le script .avs suivant :
# Chargement du MPEG2 #
LoadPlugin("DGDecode.dll")
mpeg2source("movie.d2v")
Avec movie.d2v crée à partir de DGMPGDEC et movie.mpg

On va maintenant étoffer un peu ce script avec des fonctions permettant de traiter la vidéo.
Le premier plugin à utiliser est le filtre permettant le désentrelacement de la vidéo. En effet lorsque l'on enregistre une émission de télévision on a bien souvent lors de l'affichage de la vidéo des lignes décallées qui sont du plus mauvais effets. On dit que les images sont entrelacées. Il existe de nombreux plugins de désentrelacement tels que SmoothDeinterlacer, Decomb, Leakkerneldeint, mais je préfère utiliser le pluginC Yadif, qui donne de très bon résultats et qui est rapide. On rajoutera alors au script :
# Désentrelacement du MPEG2 #
LoadCplugin("yadif.dll")
Yadif()

Il n'est pas nécessaire de charger des plugins pour utiliser des fonctions AVISYNTH, par exemple pour les cas suivants où l'on peut avoir besoin d'enlever (crop) ou de rajouter (AddBorder) des bordures, voire de redimensionner la video ( LanczosResize).
On utilisera alors:
Crop(gauche, haut, -droit, -bas) #pixels à enlever
AddBorder(gauche, haut, droit, bas) #pixels à rajouter
LanczosResize(largeur, hauteur) #redimensionnement

Un plugin pratique permet d'enlever des bordures puis de les rajouter pour par exemple supprimer un éventuel logo de chaîne TV. Ce plugin c'est BorderControl.dll que l'on utilise comme suit :
LoadPlugin("BorderControl.dll")
BorderControl(XLB=0,YTB=40,XRB=0,YBB=40)
# XLB : nbre de pixels à gauche
# YTB : nbre de pixels en haut
# XRP : nbre de pixels à droite
# YBB : nbre de pixels en bas

Pour enlever le logo d'une chaîne TV qui serait présent en dehors des bandes noires (donc sur la vidéo), il existe de nombreux plugins, mais je préfère utiliser celui de VirtualDub : logoaway, car contrairement aux autres plugins AVISYNTH, on ne passe pas par la création du logo en BMP pour le soustraire à la vidéo. Pour ce faire on rajoute au script les lignes suivantes :
ConvertToRGB() #nécessaire pour fonctionner avec le plugin
LoadVirtualdubPlugin("logoaway.vdf", "L")
L( 2, 2949155, 7209000, 0, 0, 5, 0, 66051, 0, 1, "", "")

Pour trouver les éléments les parenthèses du L, on lance VirtualDubMPEG2 et on charge le fichier MPEG2 à traiter. On utilise le filtre logoaway (au préalable chargé et installé dans le répertoire des plugins de VirtualDubMPEG2. Puis on enregistre les paramètres de traitement et on édite le fichier .vcf ainsi créé. On repère la ligne ressemblant à L() et on copie les paramètres dans le script AVISYNTH. Comme cette méthode est complexe, on peut faire autrement en modifiant le script comme suit :

################################
# Logoaway by Krzysztof Wojdon #
################################

function VD_LogoAway(clip clip, string "mode", int "x", int "y", int "width",
\ int "height", int "keyframe", int "color")
{
LoadVirtualdubPlugin("logoaway.vdf", "_VD_LogoAway")
mode = default(mode, "xblur")
mode = (mode=="xblur")?1:(mode=="yblur")?2:(mode=="xyblur")?3:(mode=="copy")?4:
\ (mode=="avgborder")?5:(mode=="solid")?6:0
Assert(mode>0, "VD_LogoAway: mode must be one of: xblur yblur xyblur copy avgborder solid")
return clip._VD_LogoAway(mode, default(x,300), default(y,8), default(width,14),
\ default(height,12), default(keyframe,0), default(color,0))
}

Dans le script précédent, il est facile de rentrer à la main les coordonnées de la surface à traiter, soit les positions x et y du rectangle ainsi que sa largeur width et sa hauteur height.

Voila pour les fonctions principales, en général, mes enregistrements sont déjà au format DVD (720x576), et donc je me contente de charger la vidéo MPEG2 et d'appliquer un désentrelacement. Mon script typique est donc le suivant :

LoadPlugin("DGDecode.dll")
LoadCplugin("yadif.dll")
#chargement de la vidéo
mpeg2source("movie.d2v")
#désentrelacement
Yadif()
#
#suppression des bordures
#Crop(0, 24, -0, -24)
#
#ajout des bordures
#AddBorders(0, 24, 0, 24)
#
#suppression du logo
#ConvertToRGB() #nécessaire pour fonctionner avec le plugin
#LoadVirtualdubPlugin("logoaway.vdf", "L")
#L( 2, 2949155, 7209000, 0, 0, 5, 0, 66051, 0, 1, "", "")