Utiliser l'ActiveX Windows Media Player dans votre Application

Lelong Julien

À travers cet article, nous découvrirons comment utiliser les fonctionnalités de base de l'ActiveX WindowsMediaPlayer. Nous verrons donc comment créer sa propre playlist, activer ou non les différents modes de lecture (aléatoire, répété).

- Titre : Utiliser l'ActiveX Windows Media Player dans votre Application

- Auteur : Lelong Julien

- Parution : 19 novembre 2008

- Mise à jour : 5 janvier 2020

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2008 Lelong Julien. 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. Présentation

- II. Importation de l'ActiveX

- III. Utilisation de l'ActiveX WindowsMediaPlayer en conception (Design-Time)

- IV. Utilisation de l'ActiveX WindowsMediaPlayer par code

- IV-A. Les fonctionnalités de base : lecture, pause, stop

- IV-A-1. Création de l'ActiveX TWindowsMediaPlayer

- IV-A-2. Mode lecture

- IV-A-3. Mode pause

- IV-A-4. Mode stop

- IV-A-5. Code complet

- IV-B. Un peu plus de fonctions : affichage de la durée, gestion du volume

- IV-B-1. Affichage de la durée

- IV-B-2. Gestion du Volume

- IV-C. Gérer une PlayList

- IV-C-1. Création de la PlayList

- IV-C-2. Ajouter un fichier à la PlayList

- IV-C-3. Supprimer un fichier de la PlayList

- IV-C-4. Jouer le morceau suivant ou précédent

- IV-C-5. Mode aléatoire, répété

- V. Téléchargement

- VI. Conclusion

- VII. Remerciement

I - Présentation

À travers cet article, nous découvrirons comment utiliser les fonctionnalités de base de l'ActiveX WindowsMediaPlayer. Nous verrons donc comment créer sa propre playlist, activer ou non les différents modes de lecture (aléatoire, répété).

II - Importation de l'ActiveX

Lancez Delphi, mais ne créez aucun projet. Si un projet est ouvert, faites :

- Fichier ;

- Tout fermer.

De base, Delphi n'a pas l'ActiveX Windows Media Player d'importé. Il nous faut donc le faire.
Pour cela, suivez les étapes ci-dessous :

- cliquez sur l'onglet Composant ;

- sélectionnez Importer un composant ;

- sélectionnez Importer un contrôle ActiveX puis faites Suivant ;

- sélectionnez l'ActiveX Windows Media Player (situé vers la fin) puis faites Suivant ;

- renseignez la palette en inscrivant « ActiveX », cliquez directement sur « Suivant » ;

- sélectionnez Installer dans un package existant (façon la plus simple) puis faites Suivant ;

- cliquez sur Parcourir et rechercher le package dclusr.dpk (Pour D2009, il se situe dans C:\Program Files\CodeGear\RAD Studio\6.0\lib) ;

- enfin, cliquez sur Terminer.

La compilation s'effectue est un message final nous avertit que tout est installé.

Installation ActiveX réussie

Maintenant que l'ActiveX est installé, nous pouvons créer notre application.
Nous allons donc avant toute chose tout fermer :

- Fichier ;

- Tout fermer.

III - Utilisation de l'ActiveX WindowsMediaPlayer en conception (Design-Time)

Tout d'abord, créons une nouvelle application. Ensuite déposons sur notre Form l'ActiveX TWindowsMediaPlayer présent dans la palette ActiveX.

ActiveX WindowsMediaPlayer

Nous renommons directement la propriété Name de notre ActiveX en WMP et mettons par la même occasion la propriété align à AlClient.

Vous devriez arriver à ce résultat :

Vous remarquerez que le lecteur ne prend pas toute la Form, pourtant, sa taille est bien définie.

Pour vous en persuader, lancez l'application avec la touche F9.

Désormais, nous pouvons lire une musique ou une vidéo.
Pour ce faire, il faut renseigner la propriété URL de l'ActiveX en indiquant le chemin du fichier à lire.

L'URL du fichier à lire doit être le chemin complet si ce dernier ne se trouve pas dans le même répertoire que l'application.

Pareillement, rien ne vous empêche de lire un fichier avi !

Il ne vous reste plus qu'à contrôler le lecteur comme bon vous semble.
Notez également que lorsque vous faites un clic droit sur le TWindowsMediaPlayer, un menu déroulant apparaît vous permettant bon nombre de possibilités.

IV - Utilisation de l'ActiveX WindowsMediaPlayer par code

Nous créons un nouveau projet Delphi pour cette partie.
Tout sera géré par code. Dans cette partie, nous ne traiterons que de la lecture de fichiers musicaux.

Commencez par créer une interface ressemblant à ceci :

Interface Windows Media Player

IV-A - Les fonctionnalités de base : lecture, pause, stop

IV-A-1 - Création de l'ActiveX TWindowsMediaPlayer

Nous instancions l'ActiveX par code.
Il faut avant tout rajouter dans les uses ces trois unités : WMPLib_TLB, OleServer, OleCtrls.
Ensuite, nous déclarons une variable globale WMP et dans le OnCreate de la Form, nous l'instancions, ce qui donne ceci :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WMPLib_TLB, OleServer, OleCtrls;

type
TForm1 = class(TForm)
BtnLecture: TButton;
BtnPause: TButton;
BtnStop: TButton;
LabelPisteEnCours: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
WMP:TWindowsMediaPlayer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
WMP:=TWindowsMediaPlayer.Create(Form1);
// Évite que la lecture d'un média démarre automatiquement
WMP.settings.autoStart:=false;
end;

end.

Seule la ligne instanciant l'ActiveX est nécessaire ! En effet, nous n'utiliserons pas l'interface que nous propose l'ActiveX.

Remarquez également que j'ai mis la propriété autoStart à false. Ceci empêche la lecture automatique d'un média s’il y en a déjà un.

IV-A-2 - Mode lecture

Dans l'événement OnClick du BtnLecture, nous allons renseigner la propriété URL du TWindowsMediaPlayer en spécifiant le chemin du fichier à écouter.
De plus, nous afficherons le titre du média dans le label.

procedure TForm1.BtnLectureClick(Sender: TObject);
begin
WMP.URL:='MonFichier.mp3';
// Lance la lecture du fichier
WMP.controls.play;
// Récupère le titre du média lu actuellement
LabelPisteEnCours.Caption:=WMP.currentMedia.name;
// Désactive le Bouton de lecture
BtnLecture.Enabled:=false;
end;

Vous pouvez tester le tout. Le titre du média apparaîtra dans le label.
Vous l'avez déjà sans doute compris, tout se passe par la méthode controls. C'est donc à partir de là que nous pouvons agir sur la lecture, la pause, l'arrêt, etc., du média.

IV-A-3 - Mode pause

Nous codons maintenant la partie pour mettre en pause le média.
Ceci se passe dans l'événement OnClick du BtnPause.
Nous désactiverons le bouton pause et nous rajouterons un test sur le bouton Lecture pour la reprise afin de savoir si le morceau était déjà lancé ou non.
Le code pour la mise en pause est donc :

procedure TForm1.BtnPauseClick(Sender: TObject);
begin
WMP.controls.pause;
// Désactive le bouton Pause
BtnPause.Enabled:=false;
// Réactive le bouton Lecture
BtnLecture.Enabled:=true;
end;

Le code pour le bouton de lecture quant à lui se trouve modifié. Nous utilisons la propriété PlayState qui nous retournera l'état du lecteur pour rejouer ou non le fichier depuis le début.

procedure TForm1.BtnLectureClick(Sender: TObject);
begin
// On définit les états des boutons Lecture, Pause, Stop
BtnLecture.Enabled:=false;
BtnPause.Enabled:=true;
BtnStop.Enabled:=true;
// Selon le statut de lecture, on effectue telle ou telle action
case WMP.playState of
wmppsUndefined,wmppsStopped : begin
WMP.URL:='MonFichier.mp3';
LabelPisteEnCours.Caption:=WMP.currentMedia.name;
WMP.controls.play;
end;
wmppsPaused : begin
WMP.controls.play;
end;
end;
end;

IV-A-4 - Mode stop

Pour terminer, il nous reste à coder le bouton BtnStop.
Rien de bien difficile, le plus dur étant déjà traité.

procedure TForm1.BtnStopClick(Sender: TObject);
begin
WMP.controls.stop;
// Désactive le bouton Stop et Pause
BtnStop.Enabled:=false;
BtnPause.Enabled:=false;
// Réactive le bouton de lecture
BtnLecture.Enabled:=true;
end;

IV-A-5 - Code complet

Voici le code complet pour la gestion de base d'un média :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WMPLib_TLB, OleServer, OleCtrls;

type
TForm1 = class(TForm)
BtnLecture: TButton;
BtnPause: TButton;
BtnStop: TButton;
LabelPisteEnCours: TLabel;
procedure FormCreate(Sender: TObject);
procedure BtnLectureClick(Sender: TObject);
procedure BtnPauseClick(Sender: TObject);
procedure BtnStopClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
WMP:TWindowsMediaPlayer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
WMP:=TWindowsMediaPlayer.Create(Form1);
// Évite que la lecture d'un média démarre automatiquement
WMP.settings.autoStart:=false;
end;

procedure TForm1.BtnLectureClick(Sender: TObject);
begin
// On définit les états des boutons Lecture, Pause, Stop
BtnLecture.Enabled:=false;
BtnPause.Enabled:=true;
BtnStop.Enabled:=true;
// Selon le statut de lecture, on effectue telle ou telle action
case WMP.playState of
wmppsUndefined,wmppsStopped : begin
WMP.URL:='MonFichier.mp3';
LabelPisteEnCours.Caption:=WMP.currentMedia.name;
WMP.controls.play;
end;
wmppsPaused : begin
WMP.controls.play;
end;
end;
end;

procedure TForm1.BtnPauseClick(Sender: TObject);
begin
WMP.controls.pause;
// Désactive le bouton Pause
BtnPause.Enabled:=false;
// Réactive le bouton Lecture
BtnLecture.Enabled:=true;
end;

procedure TForm1.BtnStopClick(Sender: TObject);
begin
WMP.controls.stop;
// Désactive le bouton Stop et Pause
BtnStop.Enabled:=false;
BtnPause.Enabled:=false;
// Réactive le bouton de lecture
BtnLecture.Enabled:=true;
end;

end.

Il ne vous reste plus qu'à tester le tout.

IV-B - Un peu plus de fonctions : affichage de la durée, gestion du volume

IV-B-1 - Affichage de la durée

Pour afficher la durée du média, il faut passer par l'événement OnStatusChange qui, lorsque le statut du lecteur sera en lecture, rajoutera l'info temps dans le libellé.
Voici le code en conséquence (seules les parties modifiées sont affichées) :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WMPLib_TLB, OleServer, OleCtrls, ExtCtrls;

type
TForm1 = class(TForm)
BtnLecture: TButton;
BtnPause: TButton;
BtnStop: TButton;
LabelPisteEnCours: TLabel;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure BtnLectureClick(Sender: TObject);
procedure BtnPauseClick(Sender: TObject);
procedure BtnStopClick(Sender: TObject);
private
{ Déclarations privées }
procedure StatusChange(ASender: TObject);
public
{ Déclarations publiques }
WMP:TWindowsMediaPlayer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
WMP:=TWindowsMediaPlayer.Create(Form1);
// Évite que la lecture d'un média démarre automatiquement
WMP.settings.autoStart:=false;
WMP.OnStatusChange:=StatusChange;
end;

procedure TForm1.BtnLectureClick(Sender: TObject);
begin
// On définit les états des boutons Lecture, Pause, Stop
BtnLecture.Enabled:=false;
BtnPause.Enabled:=true;
BtnStop.Enabled:=true;
// Selon le statut de lecture, on effectue telle ou telle action
case WMP.playState of
wmppsUndefined,wmppsStopped : begin
WMP.URL:='MonFichier.mp3';
WMP.controls.play;
end;
wmppsPaused : begin
WMP.controls.play;
end;
end;
end;

procedure TForm1.StatusChange(ASender: TObject);
begin
case WMP.playState of
wmppsPlaying :  begin
Timer.Enabled:=true;
LabelPisteEnCours.Caption:=WMP.currentMedia.name+' ('+WMP.currentMedia.durationString+')';
JvTrackBar1.Max:=Trunc(WMP.currentMedia.duration);
JvTrackBar1.Frequency:=1;
end;
wmppsStopped :  begin
BtnLecture.Enabled:=true;
BtnPause.Enabled:=false;
BtnStop.Enabled:=false;
end;
end;
end;

IV-B-2 - Gestion du Volume

Nous rajoutons une TTrackBar (onglet Win32) pour gérer le son que nous renommerons TrackBarVolume et un TLabel que nous renommerons LabelVolume, pour ressembler à l'image ci-dessous.

Nous modifions certaines propriétés de la TrackBar :

- Max : 100 (volume maximum 100 %) ;

- Frequency : 5 (pas d'affichage tous les 5 %).

Nous modifions le code du OnCreate de la Form pour prendre en compte la modification du volume, et nous rajoutons du code dans l'événement OnChange de la TrackBar pour la gestion du volume.

procedure TForm1.FormCreate(Sender: TObject);
begin
WMP:=TWindowsMediaPlayer.Create(Form1);
// Évite que la lecture d'un média démarre automatiquement
WMP.settings.autoStart:=false;
WMP.OnStatusChange:=StatusChange;
WMP.settings.volume:=50;
TrackBarVolume.Position:=50;
end;

procedure TForm1.TrackBarVolumeChange(Sender: TObject);
begin
WMP.settings.volume:=TrackBarVolume.Position;
end;

Pour mettre le son sur Mute (muet) il suffit d'utiliser la propriété mute (WMP.settings.mute) et de lui affecter true ou false selon le besoin.

IV-C - Gérer une PlayList

Dans cette partie, nous verrons comment manipuler une PlayList.
Nous verrons donc comment créer notre PlayList, ajouter des fichiers à celle-ci et en supprimer.

IV-C-1 - Création de la PlayList

Pour créer notre PlayList, nous déclarons une variable dans la partie public de type IWMPPlaylist. De cette façon, nous pouvons avoir accès à la PlayList de la Form1 via la Form de création de notre PlayList. Nous rajoutons donc un bouton sur la Form1 nommé BtnCreerPlayList ainsi que deux autres boutons BtnSuivant et BtnPrecedent.
Par la même occasion, nous ajoutons déjà dans dans les uses de celle-ci l'unité unit2 qui fait référence à la Form2 (création de la playlist).
Voici la déclaration :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StrUtils, StdCtrls, WMPLib_TLB, OleServer, OleCtrls, ExtCtrls, ComCtrls, Unit2;

type
TForm1 = class(TForm)
BtnLecture: TButton;
BtnPause: TButton;
BtnStop: TButton;
LabelPisteEnCours: TLabel;
TrackBarVolume: TTrackBar;
LabelVolume: TLabel;
BtnCreerPlayList: TButton;
BtnPrecedent: TButton;
BtnSuivant: TButton;
procedure FormCreate(Sender: TObject);
procedure BtnLectureClick(Sender: TObject);
procedure BtnPauseClick(Sender: TObject);
procedure BtnStopClick(Sender: TObject);
procedure TrackBarVolumeChange(Sender: TObject);
procedure BtnCreerPlayListClick(Sender: TObject);
private
{ Déclarations privées }
procedure StatusChange(ASender: TObject);
public
{ Déclarations publiques }
maPlayList:WMPLib_TLB.IWMPPlaylist;
WMP:TWindowsMediaPlayer;
end;

Voici la présentation de la Form1 :

Nous créons donc la nouvelle Form qui nous servira pour la création de la PlayList et nous rajoutons tout de suite dans les uses, la référence à la Form1 ainsi que l'unité WMPLib_TLB.

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WMPLib_TLB, Unit1;

La création des interfaces étant finie, nous pouvons désormais nous attarder sur la gestion de la PlayList.

IV-C-2 - Ajouter un fichier à la PlayList

Tout d'abord, nous filtrons le type de fichier à ajouter.
Pour cela, on définit la propriété filter du OpenDialog dans le OnCreate :

procedure TForm2.FormCreate(Sender: TObject);
begin
OpenDialog.Filter:='*.mp3|*.mp3';
end;

Ensuite, nous codons la partie permettant l'ajout d'un fichier et par la même occasion, le bouton Valider.

procedure TForm2.BtnAjouterClick(Sender: TObject);
var
// On déclare le média à ajouter à la playList
chanson:WMPLib_TLB.IWMPMedia;
begin
// Si le EdTitrePlayList est vide, on affiche un message d'erreur
if(EdTitrePlayList.Text<>'')then
begin
// Si notre PlayList n'a pas encore été créée, alors on la crée, sinon on modifie son titre
if(not(Assigned(Form1.maPlayList)))then
begin
Form1.maPlayList:=Form1.WMP.playlistCollection.newPlaylist(EdTitrePlayList.Text);
end
else
begin
Form1.maPlayList.name:=EdTitrePlayList.Text;
end;

if(OpenDialog.Execute())then
begin
// On crée le média et on l'ajoute dans la PlayList ainsi que dans le ListBoxPlayList
chanson:=Form1.WMP.newMedia(OpenDialog.FileName);
ListBoxPlayList.Items.Add(OpenDialog.FileName);
Form1.maPlayList.insertItem(ListBoxPlayList.Items.Count-1,chanson);
end;
end
else
begin
ShowMessage('Veuillez saisir le titre de la PlayList avant de continuer');
EdTitrePlayList.SetFocus;
end;
end;

procedure TForm2.BtnValiderClick(Sender: TObject);
begin
Self.Close;
end;

Ici, on ajoute un fichier directement lorsque la sélection via l'OpenDialog est faite. Ce n'est juste pour l'exemple, car le plus judicieux aurait été de faire une boucle qui ajouterait les fichiers une fois que l'on a validé entièrement le tout.

La partie d'ajout de fichiers est terminée, il nous reste à modifier le bouton de lecture situé sur la Form1 pour prendre en compte la PlayList.

procedure TForm1.BtnLectureClick(Sender: TObject);
begin
// On définit les états des boutons Lecture, Pause, Stop
BtnLecture.Enabled:=false;
BtnPause.Enabled:=true;
BtnStop.Enabled:=true;
// Selon le statut de lecture, on effectue telle ou telle action
case WMP.playState of
wmppsUndefined,wmppsStopped : begin
if(not(Assigned(maPlayList)))then
begin
WMP.URL:='C:\MaMusique\04 - soft meeting - going back home.mp3';
end
else
begin
WMP.currentPlaylist:=maPlayList;
end;
WMP.controls.play;
end;
wmppsPaused : begin
WMP.controls.play;
end;
end;
end;

Testez, et vous verrez, ça fonctionne !

IV-C-3 - Supprimer un fichier de la PlayList

Nous avons vu comment ajouter un fichier, maintenant, voyons comment en supprimer un. Nous repassons donc sur la Form2 et implémentons le code suivant dans le OnClick du BtnSupprimer.

procedure TForm2.BtnSupprimerClick(Sender: TObject);
var
chanson:WMPLib_TLB.IWMPMedia;
begin
// Si la liste n'est pas vide et qu'on a sélectionné un Item
if((ListBoxPlayList.Items.Count>0) and (ListBoxPlayList.ItemIndex<>-1))then
begin
// On récupère l'item en question
chanson:=Form1.maPlayList.Item[ListBoxPlayList.ItemIndex];
// On le supprime
Form1.maPlayList.removeItem(chanson);
// On le retire de la ListBox
ListBoxPlayList.Items.Delete(ListBoxPlayList.ItemIndex);
end;
end;

IV-C-4 - Jouer le morceau suivant ou précédent

Il nous reste qu'à coder la partie correspondant au bouton suivant et précédent.
Je vous mets directement le code, rien de bien compliqué.

procedure TForm1.BtnPrecedentClick(Sender: TObject);
begin
WMP.controls.previous;
end;

procedure TForm1.BtnSuivantClick(Sender: TObject);
begin
WMP.controls.next;
end;

IV-C-5 - Mode aléatoire, répété

Ces modes permettent d'activer le mode Shuffle et Loop du TWindowsMediaPlayer.
Nous ajoutons deux TCheckBox (CheckBoxRandom,CheckBoxRepeat) pour la gestion de ces modes.
L'interface ressemble à celle-ci :

Pour activer ou non ces modes, il faut utiliser la propriété SetMode dans WMP.Settings et la propriété GetMode pour avoir l'état du mode.

procedure TForm1.CheckBoxRandomClick(Sender: TObject);
begin
WMP.settings.setMode('shuffle',CheckBoxRandom.Checked);
end;

procedure TForm1.CheckBoxRepeatClick(Sender: TObject);
begin
WMP.settings.setMode('loop',CheckBoxRepeat.Checked);
end;

V - Téléchargement

Le projet complet est disponible en téléchargement en cliquant ici.
Je rappelle tout de même que le projet a été créé sous Delphi 2009. La compatibilité avec les versions précédentes de Delphi devrait cependant être assurée.

VI - Conclusion

Ce tutoriel aborde les fonctionnalités de base du lecteur WindowsMediaPlayer. Je n'ai pas couvert toutes les possibilités, mais vous avez déjà un aperçu de ce que l'on peut faire et également savoir dans quelle direction chercher pour utiliser telle ou telle propriété.
De même, ce tutoriel n'a pas couvert la lecture de fichiers vidéo puisque la gestion se fait quasiment de la même façon que pour un fichier audio.
Dans tous les cas, j'espère que ce tuto vous a plu.

VII - Remerciement

Je tiens à remercier Aka Guymelef de m'avoir aidé à améliorer la qualité de ce tutoriel, ainsi que Pedro et Laurent Dardenne pour la relecture.