Utilisation du pack de composants DSPACK avec Delphi 2005

Christopher PECAUD

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.

- Titre : Utilisation du pack de composants DSPACK avec Delphi 2005

- Auteur : Christopher PECAUD

- Parution : 28 avril 2005

- Mise à jour : 6 décembre 2019

- Licence : Copyright ® 2005 Christopher PECAUD. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Avant-propos

- II. Prérequis

- II-A. L'installation du pack

- II-B. Modifications du code et installation des composants pour Delphi 2005

- II-C. Installation de codecs

- III. GraphEdit - première approche de DirectShow

- IV. Utilisation des composants DSPACK

- IV-A. Préliminaires

- IV-B. Lecture d'un fichier multimédia

- IV-C. Gestion de l'affichage

- IV-D. Contrôle des couleurs

- IV-E. Gestion du volume

- V. Conclusion

I - Avant-propos

À travers ce tutoriel je vais vous montrer comment utiliser le pack de composants DSPACK afin de créer des applications DirectShow sous Delphi. Ce projet a été créé par la communauté SourceForge et il est totalement gratuit. Il est composé d’un certain nombre de composants permettant de faciliter l’accès à DirectShow. Nous en verrons les principaux durant l’étude de ce tutoriel.

Afin de bien appréhender la programmation DirectShow sous Delphi, j’ai décomposé ce tutoriel en quatre parties. Tout d’abord nous verrons quels sont les prérequis pour pouvoir utiliser le DSPACK sous Delphi, c’est-à-dire les éléments essentiels à télécharger et à installer sur votre disque dur.

Nous verrons ensuite qu’il est nécessaire d’apporter quelques modifications aux sources d’origine pour pouvoir installer le pack sous Delphi 2005 dans de bonnes conditions. Nous verrons ensuite comment il est possible d'aborder facilement DirectShow grâce au logiciel GraphEdit sans taper une ligne de code. Je vous donnerai toutes les informations pour créer votre premier programme. Nous verrons ensuite des notions plus avancées vous permettant d'utiliser dans vos applications les principaux composants du pack. La lecture de ce tutoriel vous permettra d'acquérir les notions de base pour créer votre propre application de type Media Player.

II - Prérequis

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.

II-A - L'installation du pack

Vous allez donc commencer bien entendu par télécharger le pack lui-même à partir du site www.progdigy.com en cliquant sur le lien DSPACK. Après l’avoir téléchargé, installez-le sur votre PC. Pour information, je l’ai installé dans le répertoire …\Borland\BDS 3.0\. Voici ce que vous devriez obtenir :

Une fois cette opération effectuée, il va falloir donner à Delphi l’emplacement des bibliothèques de fonctions DSPACK, comme suit :

- cliquez sur Outils->Options ;

- faites dérouler la liste Options d’environnement -> Options Delphi -> Bibliothèque Win32 ;

- cliquez sur Ajouter…

- ajoutez les chemins d’accès de DSPACK.

Vous devez obtenir ceci :

II-B - Modifications du code et installation des composants pour Delphi 2005

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’erreurs se produit.

Il faut donc apporter un certain nombre de changements au code de DirectX9_D7. Voici les modifications à apporter au code :

- dans le fichier DirectDraw.pas remplacez :
PDirectDrawSurface = IDirectDrawSurface
par :
PDirectDrawSurface = ^IDirectDrawSurface ;

- dans DSUtil.pas Ajoutez l'unité variants dans la clause uses ;

- à la ligne 3072 remplacez :
result := nil;
par
result := NULL;

- enfin il faut rajouter dans les uses de DSeditors cette ligne :
{$IFDEF VER170} DesignIntf, DesignEditors, {$ELSE}.

Ensuite il faut installer le package proprement dit dans la liste des composants. Avant toute chose vous devez avoir compilé 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 :

II-C - Installation de codecs

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 possible.

Ceux-ci peuvent être installés grâce à l’installation d’applications de type Media Player (Windows Media Player, VLC, ou encore Media Player Classic que je vous recommande), ou d’applications de lecture de DVD (WInDVD par exemple), mais aussi de montage vidéo (Avid, Pinnacle, etc.), ou encore, en ce qui me concerne, après l’installation d’un périphérique d’acquisition ou de diffusion comme la Pinnacle PCTV/USB…

Voici deux codecs en téléchargements gratuits qui vous aideront à réaliser votre première application :

- K-Lite Codec

- Matroska Pack Full

III - 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, allez 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 de choisir le fichier que vous voulez visualiser. Une fois qu'il est 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 média. 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 cliquez 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és. 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 vidéo (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.

IV - 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.

IV-A - 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 œuvre afin de produire un Media Player de base avec Delphi.

IV-B - Lecture d'un fichier multimédia

Cette fonction multimédia met en œuvre les trois composants que l'on a déposés 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 œuvre la fonction qui permet de mettre en pause le filterGraph. Voici la fonction :

filtergraph1.Pause

Cela se résume donc à 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, cela 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 multimédia.

IV-C - Gestion de l'affichage

Maintenant, voyons comment gérer l'affichage des vidéos (Mode Plein Écran, 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édiaire 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édiaire 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éinitialiser 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 affichages 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.

IV-D - 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édiaire de la fonction RestoreDefault

frmMediaPlayer.DSVideoWindowEx21.ColorControl.RestoreDefault;

IV-E - 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.

V - 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.