I. Avant-propos

A 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 :

Image non disponible

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…
  • Ajouter les chemins d’accès de DSPACK.

Vous devez obtenir ceci :

Image non disponible

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’erreur 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 remplacer :
    PDirectDrawSurface = IDirectDrawSurface
    par :
    PDirectDrawSurface = ^IDirectDrawSurface
  • Dans DSUtil.pas Ajouter l'unité variants dans la clause uses
  • A la ligne 3072 remplacer :
    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 :

Image non disponible

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 :

Image non disponible

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

Ceux-ci peuvent être installé 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 :

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 aller dans le menu Graph, cliquez sur la commande Insert Filters. Là vous devriez voir apparaître la fenêtre suivante à l’écran :

Image non disponible

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 :

Image non disponible

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 cliqué 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.

Image non disponible

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 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 :

Image non disponible

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:

 
Sélectionnez
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 :

 
Sélectionnez
filtergraph1.Pause

Cela 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, cela s'effectue par le code suivant:

 
Sélectionnez
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.

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 :

 
Sélectionnez
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

 
Sélectionnez
DSVideoWindowEx21.AspectRatio := rmCrop;

pour activer l'option LetterBox vous allez utiliser ce code :

 
Sélectionnez
DSVideoWindowEx21.AspectRatio := rmLetterBox;

pour activer l'option Stretched vous allez utiliser le code suivant:

 
Sélectionnez
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 :

Image non disponible

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 :

 
Sélectionnez
procedure TfrmControleCouleur.tbLuminositeChange(Sender: TObject);
begin
frmMediaPlayer.DSVideoWIndowEx21.ColorControl.Brightness := tbLuminosite.Position;
end;

pour le contraste on aura le code suivant :

 
Sélectionnez
procedure TfrmControleCouleur.tbContrasteChange(Sender: TObject);
begin
frmMediaPlayer.DSVideoWIndowEx21.ColorControl.Contrast := tbContraste.Position;

end;

pour la teinte on aura le code suivant :

 
Sélectionnez
procedure TfrmControleCouleur.tbTeinteChange(Sender: TObject);
begin
frmMediaPlayer.DSVideoWIndowEx21.ColorControl.Hue := tbteinte.Position;

end;

pour la saturation on aura le code suivant :

 
Sélectionnez
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

 
Sélectionnez
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 :

Image non disponible

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.

 
Sélectionnez
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.