Utilisation du composant multimédia TMplayerControl

Avec Lazarus/Free Pascal

Serge Arbiol

Cet article montre comment utiliser le composant multimédia TMplayerControl avec Lazarus/Free Pascal. Je vous propose de créer pas à pas une application appelée LazMPlayer. Je l'ai écrite sous la configuration suivante : Kubuntu 16.04 et Lazarus 1.6.4.

Commentez

- Titre : Utilisation du composant multimédia TMplayerControl

- Auteur : Serge Arbiol

- Parution : 14 août 2017

- Public visé :

- 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 ® 2017 Serge Arbiol. 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. Télécharger et installer le composant TMplayerControl

- I-A. Qu'est-ce que TMplayerControl ?

- I-B. Téléchargement

- I-C. Installation sous Lazarus

- I-C-1. Paquet/Ouvrir un fichier de paquets (lpk)

- I-C-2. Compiler puis Utiliser/installer

- II. Création de l'application LazMPlayer

- II-A. On crée un dossier nommé LazMPlayer

- II-B. On crée une nouvelle application avec Lazarus

- II-C. On l'enregistre dans le dossier LazMPlayer

- III. Les composants visuels de l'application

- III-A. Ajout de trois panels

- III-B. Ajout de cinq boutons

- III-C. Ajout du composant TMplayerControl

- III-D. Ajout de deux labels et d'une TrackBar

- III-E. Ajout d'un dialogue d'ouverture de fichier

- IV. Les procédures et fonctions

- IV-A. La procédure FormCreate

- IV-A-1. Réglage du volume

- IV-A-2. Paramètres de lancement du composant

- IV-A-3. Propriété Filter du dialogue d'ouverture de fichier

- IV-B. La procédure BtOuvrirClick

- IV-C. La procédure MPlayerControl1Play

- IV-D. La procédure MPlayerControl1Playing

- IV-E. La procédure TrackBarVideoChange

- IV-F. Les procédures BtReculerClick et BtAvancerClick

- IV-G. La procédure BtPlayClick

- IV-H. La procédure BtPositionClick

- IV-I. La procédure MPlayerControl1Stop

- V. Conclusion

- V-A. Remerciements

- VI. Téléchargement

I - Télécharger et installer le composant TMplayerControl

Attention : LazMPlayer a été codé uniquement pour Linux. Il ne peut pas fonctionner tel quel sur un autre système(1).

I-A - Qu'est-ce que TMplayerControl ?

TMPlayerControl est un composant visuel basé sur l'application MPlayer pour GNU/Linux, qui permet de lire la plupart des formats audios et vidéos. Il faut donc avoir installé au préalable MPlayer pour pouvoir utiliser TMPlayerControl.

I-B - Téléchargement

Vous trouverez ici toutes les indications nécessaires pour télécharger et installer TMplayerControl via SVN.

SVN (Subversion) est un outil de gestion de versions. Si vous ne l'avez pas installé, vous trouverez ici tous les renseignements nécessaires pour le faire. Vous pourrez ensuite coller dans un terminal (clic droit -> Coller) l'instruction suivante (après l'avoir copiée, bien sûr) :

svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/mplayer mplayer

Astuce pour les amateurs de Dolphin : placez-vous dans le répertoire où vous voulez télécharger le composant TMplayerControl (par exemple, /home/nom_utilisateur/Pascal/Composants) puis collez dans le terminal de Dolphin (Affichage/Panneaux/Terminal) l'instruction encadrée ci-dessus. Le dossier mplayer est alors téléchargé dans le répertoire où vous vous trouvez. Il contient le paquet à installer pour Lazarus, les sources et deux exemples (FullFeatured et Simple) comme on peut le voir sur l'arborescence suivante :

Je me suis rendu compte, en consultant les exemples fournis, que le premier était trop complexe et le second pas assez détaillé. Je n'ai, par exemple pas trouvé comment placer le lecteur sur une position donnée. Après moult recherches, il m'a semblé évident de partager le fruit de mes efforts avec tous ceux qui souhaitent programmer un lecteur multimédia sous Linux sans trop perdre de temps.

Je vous propose donc de créer pas à pas une petite application permettant de lire un fichier audio ou vidéo comme indiqué dans les exemples fournis avec le composant, mais en ajoutant quelques fonctions et explications qui vous feront gagner du temps dans vos recherches.

I-C - Installation sous Lazarus

I-C-1 - Paquet/Ouvrir un fichier de paquets (lpk)

Ouvrir le fichier /mplayer/mplayercontrollaz.lpk.

I-C-2 - Compiler puis Utiliser/installer

Si tout s'est bien passé, le composant figure dans l'onglet Multimedia de la palette de Lazarus.

II - Création de l'application LazMPlayer

II-A - On crée un dossier nommé LazMPlayer

Pour moi, c'est un sous-dossier du répertoire Pascal : /home/serge/Pascal/LazMPlayer.

II-B - On crée une nouvelle application avec Lazarus

Projet/Nouveau projet/Application.

II-C - On l'enregistre dans le dossier LazMPlayer

Fichier/Enregistrer.
Nommez le projet LazMPlayer.lpi et laissez unit1.pas pour la fiche.

Redimensionnez la fiche en 300/600 (Height/Width).

III - Les composants visuels de l'application

Je vous propose de glisser sur la fiche trois panels, cinq boutons, une TrackBar entourée de deux labels et un dialogue d'ouverture de fichier.

III-A - Ajout de trois panels

On crée trois panels : un pour les boutons, un autre pour contenir une TrackBar (ainsi que deux labels indiquant la position et la durée) et enfin un dernier pour le composant TMplayerControl.

Placer sur la fiche trois panels et affecter ainsi leur propriété align avec l'inspecteur d'objets :

Panel1.align := alTop;

Panel2.align := alBottom;

Panel3.align := alClient;

III-B - Ajout de cinq boutons

Cinq boutons permettront d'ouvrir un document multimédia, de reculer d'une seconde, d'avancer d'une seconde, de mettre le lecteur en pause et de placer le lecteur sur une position précise.

Glisser cinq boutons sur Panel1.

Renseigner ainsi leur propriété Caption :

- Bouton1 : « Ouvrir » ;

- Bouton2 : « <-- » ;

- Bouton3 : « --> » ;

- Bouton4 : « Play/Pause » ;

- Bouton5 : « 00:01:00,000 ».

Modifier leur propriété Name :

- Bouton1 : « BtOuvrir » ;

- Bouton2 : « BtReculer » ;

- Bouton3 : « BtAvancer » ;

- Bouton4 : « BtPlay » ;

- Bouton5 : « BtPosition ».

III-C - Ajout du composant TMplayerControl

Avec ma version de Lazarus, le composant se trouve dans l'onglet Multimedia. On le glisse dans Panel3 et on met sa propriété align sur alClient.

III-D - Ajout de deux labels et d'une TrackBar

Glisser deux labels dans Panel2 et affecter leur propriété align :

Label1.align := alLeft;

Label2.align := alRight;

Modifiez leur propriété Name ainsi :

- Label1 : « LbPos » ;

- Label2 : « LbDuree ».

Sur la place restée vacante entre les deux labels, glissez une TrackBar (ce composant se trouve dans Common Controls), redimensionnez-la à votre convenance et placez-la au centre de Panel2. Nommez-la TrackBarVideo.

III-E - Ajout d'un dialogue d'ouverture de fichier

Glisser un composant OpenDialog. On mettra sa propriété Filter sur les formats voulus (vidéos et/ou audios) dans l'événement onCreate de la fiche. Il ne manque plus qu'à mettre un chaîne vide aux propriétés Caption des trois Panels, ce sera nettement plus esthétique.

Vous devriez obtenir à peu près ceci :

IV - Les procédures et fonctions

IV-A - La procédure FormCreate

On crée le gestionnaire onCreate de la fiche avec l'inspecteur d'objet. Nous allons y mettre quelques instructions pour initialiser notre composant.

Mais d'abord, on met un titre sympa :

Caption:='LazMPlayer - Serge Arbiol - Juillet 2017';

IV-A-1 - Réglage du volume

Je vous propose une valeur que vous pouvez bien sûr modifier à votre guise. Il serait plus pratique de placer une TrackBar pour régler le volume. Ce sera l'objet d'un développement ultérieur.

MPlayerControl1.Volume := 80;

IV-A-2 - Paramètres de lancement du composant

Il s'agit des paramètres du programme de base MPlayer que gère notre composant TMplayerControl. Voir la documentation.

MPlayerControl1.StartParam := '-vo x11 -zoom -fs';

L'instruction ci-dessus indique à MPlayer qu'il doit utiliser la sortie vidéo x11 et permettre le zoom logiciel et l'affichage plein écran si le pilote le supporte.

IV-A-3 - Propriété Filter du dialogue d'ouverture de fichier

Pour pouvoir lire des vidéos mais aussi des documents audios, nous allons procéder ainsi.

Définissons deux variables de type chaîne de caractères : FormatsVideo et FormatsAudio, auxquelles nous affecterons les formats les plus répandus.

procedure TForm1.FormCreate(Sender: TObject);
var
FormatsVideo,
FormatsAudio : String;

FormatsVideo:='*.AVI;*.avi;*.WMV;*.wmv;*.MOV;*.mov;*.MKV;*.mkv;*.MP4;*.mp4;*.MPG;*.mpg;*.MPEG;*.mpeg;*.VOB;*.vob;*.FLV;*.flv;*.WEBM;*.webm'; FormatsAudio:='*.MP3;*.mp3;*.AAC;*.aac;*.WAV;*.wav;*.WMA;*.wma;*.CDA;*.cda;*.FLAC;*.flac;*.M4A;*.m4a;*.MID;*.mid;*.MKA;*.mka;*.OGG;*.ogg;*.APE;*.ape';

Affectons ensuite ces variables à la propriété Filter du dialogue d'ouverture de fichiers.

OpenDialog1.Filter:='Vidéo|'+FormatsVideo+'|Audio|'+FormatsAudio;

Nous en avons terminé avec onCreate. Récapitulons :

La procédure onCreate complète

procedure TForm1.FormCreate(Sender: TObject);
var
FormatsVideo,
FormatsAudio : String;
begin
// On règle le volume de départ
MPlayerControl1.Volume := 150;
// Paramètres de lancement de MPlayerControl1
MPlayerControl1.StartParam := '-vo x11 -zoom -fs';
// Propriété Filter du dialogue d'ouverture de fichiers
FormatsVideo:='*.AVI;*.avi;*.WMV;*.wmv;*.MOV;*.mov;*.MKV;*.mkv;*.MP4;*.mp4;*.MPG;*.mpg;*.MPEG;*.mpeg;*.VOB;*.vob;*.FLV;*.flv;*.WEBM;*.webm';
FormatsAudio:='*.MP3;*.mp3;*.AAC;*.aac;*.WAV;*.wav;*.WMA;*.wma;*.CDA;*.cda;*.FLAC;*.flac;*.M4A;*.m4a;*.MID;*.mid;*.MKA;*.mka;*.OGG;*.ogg;*.APE;*.ape';
OpenDialog1.Filter:='Vidéo|'+FormatsVideo+'|Audio|'+FormatsAudio;
end;

IV-B - La procédure BtOuvrirClick

On peut maintenant ouvrir un document en exécutant le dialogue d'ouverture de fichier. Les instructions suivantes sont limpides et se passent de commentaire.

La procédure BtOuvrirClick complète

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
MPlayerControl1.Stop;
MPlayerControl1.Filename:=OpenDialog1.FileName;
MPlayerControl1.Play;
end;
end;

IV-C - La procédure MPlayerControl1Play

Ça y est, notre fichier est lancé. Il serait souhaitable à présent d'en récupérer le nom, la durée et d'initialiser la TrackBar pour qu'elle nous indique la position courante. Pour ce faire, nous avons la procédure MPlayerControl1Play.

L'événement MPlayerControl1Play se déclenche, comme son nom l'indique, lorsque l'on exécute l'instruction MPlayerControl1.Play ; voici quelques lignes de code fort utiles.

Modifions le titre de notre application :

Caption := MPlayerControl1.Filename;

Réglons la propriété Max de notre TrackBar sur la durée du média :

TrackBarVideo.Max := Trunc(MPlayerControl1.Duration);

Affichons la durée du média dans Label2 :

LbDuree.Caption:=FormatDateTime('hh:nn:ss,zzz', MPlayerControl1.Duration / (24 * 60 * 60));

La procédure MPlayerControl1Play complète

procedure TForm1.MPlayerControl1Play(Sender: TObject);
begin
Caption := MPlayerControl1.Filename;
TrackBarVideo.Max := Trunc(MPlayerControl1.Duration);
LbDuree.Caption:=FormatDateTime('hh:nn:ss,zzz', MPlayerControl1.Duration / (24 * 60 * 60));
end;

Nous avons bien progressé, mais impossible pour le moment de mettre le lecteur sur pause et d'en connaître la position. Nous avons besoin pour cela de la procédure MPlayerControl1Playing qui fonctionne comme un Timer.

IV-D - La procédure MPlayerControl1Playing

Dans cette procédure nous allons d'abord actualiser TrackBarVideo pour qu'elle indique la position courante du lecteur. Mais avant tout, il faut neutraliser l'événement TrackBarVideo.onChange pour éviter un comportement indésirable du curseur et n'exécuter le code que si un média est chargé :

Si la durée du média est supérieure à 0 (donc un fichier est ouvert dans le lecteur), on peut continuer :

If (MPlayerControl1.Duration>0) Then

On neutralise TrackBar1.onChange :

TrackBarVideo.OnChange:=Nil;

On peut ensuite actualiser la position courante grâce à la variable APosition figurant dans les paramètres de la procédure MPlayerControl1Playing :

TrackBarVideo.Position:=Trunc(APosition);

Profitons-en pour actualiser LbPos, qui indique la position courante :

LbPos.Caption := FormatDateTime('hh:nn:ss,zzz', APosition / (24 * 60 * 60));

N'oublions surtout pas de relancer l'événement TrackBarVideo.onChange, car nous en aurons besoin pour modifier la position du lecteur.

TrackBarVideo.OnChange := @TrackBarVideoChange;

Récapitulons :

procedure TForm1.MPlayerControl1Playing(ASender: TObject; APosition: single);
begin
If (MPlayerControl1.Duration>0) Then
begin
// pour éviter la récursivité
TrackBarVideo.OnChange:=Nil;
TrackBarVideo.Position:=Trunc(APosition);
LbPos.Caption := FormatDateTime('hh:nn:ss,zzz', APosition / (24 * 60 * 60));
// rétablit la procédure
TrackBarVideo.OnChange := @TrackBarVideoChange;
end;
end;

Si vous exécutez le programme à ce stade, vous obtiendrez une erreur, car on n'a pas encore renseigné l'événement onChange de TrackBarVideo. Faisons-le de ce pas !

IV-E - La procédure TrackBarVideoChange

Le code est très simple :

La procédure TrackBarVideoChange

procedure TForm1.TrackBarVideoChange(Sender: TObject);
begin
// On affecte au lecteur la position correspondant à celle de TrackBarVideo
If (MPlayerControl1.Running) then MPlayerControl1.Position := TrackBarVideo.Position;
end;

IV-F - Les procédures BtReculerClick et BtAvancerClick

Ces boutons permettent d'avancer ou reculer d'une seconde. Modifiez-les à votre convenance :

procedure TForm1.BtReculerClick(Sender: TObject);
begin
// Recule d'1 seconde
If (MPlayerControl1.Running) then MPlayerControl1.Position:=MPlayerControl1.Position-1;
end;

Les procédures BtReculerClick et BtAvancerClick

procedure TForm1.BtAvancerClick(Sender: TObject);
begin
// Avance d'1 seconde
If (MPlayerControl1.Running) then MPlayerControl1.Position:=MPlayerControl1.Position+1;
end;

IV-G - La procédure BtPlayClick

Cette procédure permet de mettre en pause ou de relancer le média.

La procédure BtPlayClick

procedure TForm1.BtPlayClick(Sender: TObject);
begin
If (MPlayerControl1.Running) then MPlayerControl1.Paused := Not MPlayerControl1.Paused;
end;

IV-H - La procédure BtPositionClick

Voilà une procédure intéressante qui va nous permettre de placer le lecteur sur une position au format « hh:nn:ss,zzz ». Nous savons déjà le faire en secondes, mais là c'est plus amusant, car ça pose des problèmes de conversion et de compatibilité.

Dans l'événement onClick du bouton BtPosition, nous récupérons la valeur Caption de ce bouton et la convertissons en secondes avant de l'affecter à la position du lecteur.

Une fonction très pratique de l'unité DateUtils renvoie le résultat d'une date en secondes. Il s'agit de SecondOfTheDay. Mais, car il y a un mais, si votre séparateur décimal est une virgule, ça ne marche pas. J'ai eu la mauvaise idée d'utiliser DecimalSeparator := ',' mais alors c'était la procédure MPlayerControl1Playing qui ne fonctionnait plus. Donc, plutôt que d'imposer la norme française et risquer ainsi des erreurs dans les fonctions internes de ce cher Free Pascal, j'ai jugé plus sage de convertir tout simplement la virgule en point avec StringReplace pour garder une compatibilité toute anglo-saxonne avec le système.

Déclaration de l'unité DateUtils :

Et voici le résultat :

La procédure BtPositionClick

procedure TForm1.BtPositionClick(Sender: TObject);
Var
Chaine : String;
begin
// Place le lecteur sur la position indiquée dans le Caption du bouton
if (MPlayerControl1.Duration>0) Then
begin
MPlayerControl1.Paused := True;
Chaine:=BtPosition.Caption;
// convertit chaine au format hh:mn:ss.mls en TDateTime
// si le séparateur décimal est une virgule, la remplacer
// ne surtout pas utiliser DecimalSeparator := ','
Chaine:=StringReplace(Chaine,',','.',[rfReplaceAll]);
// SecondOfTheDay de l'unité DateUtils renvoie le résultat d'une date en secondes
// permet de convertir en secondes une chaine comme '00:01:20.123'
// -> ajouter DateUtils dans uses
MPlayerControl1.Position:=SecondOfTheDay(StrToTime(Chaine));
end;
end;

IV-I - La procédure MPlayerControl1Stop

Peaufinons un tout petit peu. Lorsque le média est stoppé, laissons donc le Caption de la fiche comme on l'avait trouvé en entrant :

procedure TForm1.MPlayerControl1Stop(Sender: TObject);
begin
If csDestroying In ComponentState Then exit;
Caption := 'LazMPlayer - Serge Arbiol - Juillet 2017';
end;

V - Conclusion

Nous avons vu comment télécharger, installer et utiliser le composant TMplayerControl en créant l'application LazMPlayer avec Lazarus. Ceci peut être considéré comme une base sur laquelle on peut développer un sous-titreur de vidéos, un lecteur audio, voire un séquenceur vidéo comme celui que j'avais programmé en Delphi il y a une dizaine d'années et dont je me servais chaque jour dans le cadre des cours de russe et de français dont j'avais la charge à l'université Paul Sabatier de Toulouse. J'écrirai prochainement un article sur le sujet.

J'espère avoir été utile. Bonne programmation !

V-A - Remerciements

Merci à Alcatîz pour la mise en ligne de l'article et à jacques_jean pour sa relecture orthographique.

VI - Téléchargement

Le fichier source au format PDF est téléchargeable ici.

Le programme complet au format ZIP est téléchargeable ici.

(1)Il est possible de le compiler pour Windows et de l'exécuter sur ce système, à la condition d'avoir installé MPlayer pour Windows, d'avoir inclus le chemin vers ce logiciel dans le PATH et de le démarrer avec le paramètre '-vo direct3d -nofontconfig'. Toutefois, la gestion des propriétés du composant TMPlayerControl n'est pas complète.