Je vais vous présenter dans cet article un pack de composants fort sympathique, qui permet de créer des applications multimédias en employant directement la technologie DirectShow de Microsoft.
Cette librairie est un freeware et elle est développée par la communauté Sourceforge.
Afin de pouvoir utiliser dans de bonnes conditions le pack en question il va falloir
installer un certain nombre d'outils, à commencer par le DirectX SDK de Microsoft version 9.0 (Summer
2004). Cette installation ne devant pas poser le moindre problème elle ne sera pas détaillée ici. Ensuite
il faudra installer le pack DSPACK sur votre PC. Cette installation peut poser quelques problèmes si on
l'installe sur une version de Delphi supérieure à la 7.0, donc cette installation sera détaillée dans ce
cas présent. On pourra ensuite télécharger des éléments facultatifs
qui vous aideront à aborder la programmation DirectShow dans de bonnes conditions.
Une
fois cette phase terminée vous devez apporter quelques modifications au projet
DSPACK. En effet ce pack a été créé à l’origine pour être utilisé à partir des
versions 5, 6 et 7 de Delphi. Donc il n’est pas possible d’installer
directement le pack et l’utiliser tel quel. Pour vous en convaincre ouvrez le
projet DirectX9_D7.bds. Il vous demande sous quelle plateforme vous voulez
convertir le projet. Convertissez le projet sous la plateforme Win32, Compilez
le projet. Une série d’erreur se produit.
Il faut donc apporter un certain nombre de changements au code de DirectX9_D7. Voici les modifications à apporter au code :
Ensuite il faut installer le package proprement dit dans la liste des composants. Avant toute chose vous devez avoir compiler les fichiers de projets convertis:
DirectX9_D7.bdsproj, DsPack_D7.bdsproj et DsPackDesign_D7.bdsproj. Une fois ces trois fichiers compilés, vous devez installer les packs de conception en cliquant droit sur le fichier
DsPackDesign_D7.bpl et choisir la commande Installer.
comme ceci :
Si
tout s’est bien déroulé vous devriez voir apparaître dans la liste des
composants toute une série dans la catégorie DSPACK. Comme ceci :
Voilà
maintenant vous êtes prêt à développer votre première application multimédia.
Cependant avant de commencer le développement d’une telle application vous allez
avoir besoin d’un certain nombre de filtres et de codecs, pour pouvoir gérer le
plus grand nombre de formats possibles.
2. GraphEdit - première approche de DirectShow
Nous allons utiliser pour cette première approche, le
logiciel GraphEdit, fourni avec le DirectX SDK. Ce logiciel permet de
créer une représentation sous forme de graphes permettant la lecture d’un
fichier mpg par exemple.
Lancez l’application (Démarrer->Programmes->DirectX
SDK->Utilities->GraphEdit).
Nous allons créer un graphe nous permettant de visualiser un fichier MPEG. Pour ce faire aller dans le menu Graph,
cliquez sur la commande Insert Filters. Là vous devriez
voir apparaître la fenêtre suivante à
l’écran :
Cette fenêtre contient tous les filtres installés sur
votre disque dur, ils sont répertoriés par catégorie. Pour insérer un filtre à
l’écran il suffit de double-cliquer sur celui-ci ou d’appuyer sur le bouton OK.
Le filtre qui nous intéresse pour ouvrir un fichier est le filtre File Source
(Async.) qui se trouve dans la catégorie DirectShow Filters. Une fenêtre vous
demande choisir le fichier que vous voulez visualiser. Une fois inséré sur la
zone cliente, vous devriez voir apparaître cette figure à l’écran :

Comme vous pouvez le constater un filtre peut être
assimilé à un « composant électronique » qui effectue une fonction
bien précise, dans le cas présent il nous permet d’ouvrir un fichier multimédia
et d’envoyer un flux de données via sa propre broche de sortie. Les données qui vont sortir de ce filtre dépendent du type de fichier ouvert. Donc comme on peut le
constater un filtre est formé de
broches (ou pins en anglais), qui vont l’aider à accomplir sa fonction. Vu comme
tel le graphe produit ne va pas réaliser grand chose de concluant, il lui
manque une série de filtres pour pouvoir arriver à notre fin, c’est-à-dire la
visualisation du media. Pour finaliser le graphe il suffit de relier la sortie
de notre filtre à une série de filtres, qui par leur fonction particulière vont
permettre d’aboutir au résultat escompté. Pour ce faire il suffit de cliquer
droit sur la broche Output de notre File Source, et dans le popup
cliquer sur la commande Render Pin. Et là par miracle, le
graphe se complète en fonction des filtres installés sur votre ordinateur.
Sur mon ordinateur le résultat obtenu est le suivant, mais
il peut varier en fonction des éléments installés.

On peut dire que DirectShow sait gérer intelligemment
la liaison entre les filtres, et comme je le disais avant quels que soient les
éléments installé. Ce procédé va nous permettre de programmer plus aisément nos applications. Pour vous en convaincre, et afin
de vérifier si toutes les connexions sont bien effectuées on va mettre en
lecture le graphe. Il suffit de cliquer le bouton Play pour voir la lecture du
fichier via une fenêtre Active Movie. Vous pouvez recommencer
l’opération en choisissant un autre type de fichier video (par exemple un avi).
Et vous vous apercevrez que le graphe change d’aspect, c’est-à-dire que les
filtres intermédiaires sont différents.
Pour conclure il faut garder à l’esprit que DirectShow
fonctionne à partir d’un graphe composé de filtres, accomplissant des tâches
particulières, reliés entre eux par des broches comme des « composants
électroniques » en schématisant bien sûr.
Maintenant que nous avons vu comment DirectShow gère la
lecture d’un fichier multimédia, voyons comment nous pouvons le coder
sous Delphi.
3. Utilisation des composants DSPACK
Maintenant vous allez apprendre à utiliser les principaux composants du DSPACK, tout en concevant un Media Player de base.
Vous allez comprendre comment gérer la lecture d'une vidéo, mais aussi des paramètres tels que la gestion du contrôle des couleurs, la gestion de l'affichage, ou
encore la gestion du volume.
3.1. Préliminaires
Tout d'abord créons une fiche et posons les composants suivants :
- Un composant TFilterGraph
- Un composant TDSWindowVideoEx2
- Un composant TDSTrackBar
Vous devriez vous retrouver avec ses composants sur la fiche :
Nous allons maintenant voir comment ces composants doivent être mis en oeuvre afin de produire un Media Player de base avec Delphi.
3.2. Lecture d'un fichier multimédia
Cette fonction multimédia met en oeuvre les trois composants que l'on a déposé sur la fiche. Pour résumer nous allons lire le fichier via le filterGraph et nous allons
visionner ce fichier sur le composant TDSVideoWindowEx2. La TrackBar va nous permettre de contrôler l'avancement de la lecture.
Pour réaliser ceci, modifiez les propriétés des composants comme suit:
- En ce qui concerne le composant DSVideoWindow, mettez la propriété FilterGraph à FilterGraph1 (sélection par la combobox).
- En ce qui concerne le composant TFilterGraph, mettez la propriété Mode à la valeur gmNormal
- En ce qui concerne le composant TTrackBar, positionnez la propriété FilterGraph sur la valeur FilterGraph1 composant TDSTrackBar
Maintenant vous êtes prêt pour accéder directement au code.
Nous allons nous intéresser à la fonction de lecture dont voici le code:
if not filtergraph1.active then begin
filtergraph1.active:=true;
filtergraph1.RenderFile(fichier);
end;
filtergraph1.Play;
Comme vous pouvez le constater tout se fait par l'intermédiaire du filterGraph. Il faut l'activer en testant s'il n'est pas déjà actif. La fonction RenderFile permet la lecture d'un fichier et prend en paramètre le nom du fichier de type string.
Une fois actif, il ne reste plus qu'à le mettre en lecture via la fonction Play.
Maintenant que l'on sait comment lire un fichier on va mettre en oeuvre la fonction qui permet de mettre en pause le filterGraph. Voici la fonction :
filtergraph1.Pause
Celà se résume donc en l'appel de la fonction Pause. Maintenant que l'on sait comment mettre en pause notre composant nous allons créer la fonction permettant de stopper la lecture de notre fichier
multimédia, celà s'effectue par le code suivant:
filtergraph1.Stop;
filtergraph1.Active:=false;
Comme on peut le constater il suffit d'arrêter la lecture du fichier par l'intermédiaire de la fonction Stop, et ensuite de désactiver le filterGraph.
Nous avons vu les principales fonctions qui permettent de gérer la lecture d'un fichier multimedia.
3.3. Gestion de l'affichage
Maintenant voyons comment gérer l'affichage des vidéos (Mode Plein Ecran, affichage étiré, affichage LetterBox, etc...)
Nous pouvons lui associer une fonction permettant la lecture
en plein écran. Ceci s'effectue par la fonction suivante :
If DSVideoWindowEx21.FullScreen then
begin
DSVideoWindowEx21.FullScreenTopMost := False;
DSVideoWindowEX21.SetBounds(0,0,337, 225);
DSVideoWindowEx21.NormalPlayback;
end
else
begin
DSVideoWindowEx21.FullScreenTopMost := True;
DSVideoWindowEX21.SetBounds(0,0,Screen.Width, Screen.Height);
DSVideoWindowEx21.StartFullScreen;
end;
btnFullScreen.Down := DSVideoWindowEx21.FullScreen;
Nous pouvons voir que l'affichage en mode plein écran se fait par l'intermédaire de l'objet DSVideoWindowEx2. La gestion du mode se fait par la propriété booléenne FullScreen.
Si la propriété est positionnée à la valeur True, on réinitialise l'objet pour que la vidéo soit lue en mode normal par l'intermédaire de la fonction NormalPlayBack.
On réinitialise de même les coordonnées de la vidéo pour qu'elle puisse être contenue dans la zone cliente.
Dans le cas contraire (passage du mode normal vers le mode plein écran) il suffit de réinitiliser les coordonnées de la vidéo pour qu'elle puisse prendre toute la surface de l'écran.
Le Mode est activé par la fonction StartFullScreen. Il existe trois autres modes d'affichage pour l'objet DSVideoWindowEx2. Ces trois affichage sont modifiables grâce à la propriété
AspectRatio de l'objet. Pour par exemple activer l'option Crop vous allez utiliser la ligne de code suivante
DSVideoWindowEx21.AspectRatio := rmCrop;
pour activer l'option LetterBox vous allez utiliser ce code :
DSVideoWindowEx21.AspectRatio := rmLetterBox;
pour activer l'option Stretched vous allez utiliser le code suivant:
DSVideoWindowEx21.AspectRatio := rmStretched;
Donc maintenant vous savez changer le mode d'affichage de votre vidéo. On va voir dans la prochaine partie comment contrôler les couleurs.
3.4. Contrôle des couleurs
Nous allons voir maintenant comment, par l'intermédiaire de l'objet DSVideoWindow2, il est possible d'agir sur les paramètres de
luminosité, la teinte, le contraste, et la saturation. Pour réaliser cette opération vous aurez besoin des composants suivants :

Il faut noter que les propriétés
Frequency et
Max de chaque TrackBar sont assez différentes il faut donc les initialiser comme suit:
- En ce qui concerne le composant tbLuminosite, vous allez mettre la propriété Frequency à 1000 et la propriété Max à 10000.
- En ce qui concerne le composant tbContraste, vous allez mettre la propriété Frequency à 1000 et la propriété Max à 10000.
- En ce qui concerne le composant tbTeinte, vous allez mettre la propriété Frequency à 36 et la propriété Max à 180.
- En ce qui concerne le composant tbSaturation, vous allez mettre la propriété Frequency à 2000 et la propriété Max à 20000.
Pour chaque
TrackBar on va utiliser le gestionnaire d'événements
OnChange, qui va nous permettre de changer les paramètres directement sur la vidéo.
Par exemple pour la luminosité on aura le code suivant :
procedure TfrmControleCouleur.tbLuminositeChange(Sender: TObject);
begin
frmMediaPlayer.DSVideoWIndowEx21.ColorControl.Brightness := tbLuminosite.Position;
end;
pour le contraste on aura le code suivant :
procedure TfrmControleCouleur.tbContrasteChange(Sender: TObject);
begin
frmMediaPlayer.DSVideoWIndowEx21.ColorControl.Contrast := tbContraste.Position;
end;
pour la teinte on aura le code suivant :
procedure TfrmControleCouleur.tbTeinteChange(Sender: TObject);
begin
frmMediaPlayer.DSVideoWIndowEx21.ColorControl.Hue := tbteinte.Position;
end;
pour la saturation on aura le code suivant :
procedure TfrmControleCouleur.tbSaturationChange(Sender: TObject);
begin
frmMediaPlayer.DSVideoWIndowEx21.ColorControl.Saturation := tbSaturation.Position;
end;
Il est possible de restaurer les valeurs initiales de la vidéo par l'intermédaire de la fonction RestoreDefault
frmMediaPlayer.DSVideoWindowEx21.ColorControl.RestoreDefault;
3.5. Gestion du volume
Nous allons maintenant voir comment gérer le volume sonore. Ajoutez un Label, et une TrackBar sur votre fiche comme ceci :
La propriété Frequency de la TrackBar doit être placée à 1000 et la propriété Max à 10000. Maintenant on va écrire le code
permettant de modifier le volume en fonction de l'événement OnChange de la trackBar.
procedure TfrmMediaPlayer.tbVolumeChange(Sender: TObject);
begin
tbVolume.SelEnd := tbVolume.Position;
if FilterGraph1.Active then
FilterGraph1.Volume := tbVolume.Position;
end;
Comme vous pouvez le constater la gestion du volume se fait par l'objet FilterGraph1 grâce à sa propriété Volume.
4. Conclusion
Nous avons pu voir tout au
long de ce tutoriel comment réaliser une application multimédia architecturée
autour de DirectShow en utilisant le pack de composant DSPACK 234. Il vous a
permis de vous introduire dans un univers qui permet d’effectuer des interfaces
multimédias très riches. Il vous aura surtout permis de réaliser votre premier
lecteur de fichier vidéo. Bien entendu cela n’est qu’un
avant goût mais il vous permettra, enfin, je l’espère de vous aider dans
l’apprentissage de cette technologie.