IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi .NET Discussion :

[VCL.NET] Lire une vidéo dans une application [Trucs & Astuces]


Sujet :

Delphi .NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 86
    Points : 375
    Points
    375
    Par défaut [VCL.NET] Lire une vidéo dans une application
    Bonjour à tous.

    Je cherche un moyen d'intégrer un player vidéo dans une application VCL.NET.

    Evironnement : RAD Studio 2007
    Framework : 2.0
    Language utilisé : Delphi (VCL.Net)

    Je pensais avoir deux possibilité :
    - importer l'activeX de Windows Media Player
    - utiliser microsoft.directx.audioVideoplayback.Video
    Le TMediaplayer ne convient pas car il ne supporte pas les codecs installés sur la machine.

    Dans le premier cas (import de l'activeX Media Player), Delphi me créer un Interop.WMPLib.dll à partir duquel j'arrive bien à accéder aux différentes classes, notamment le WindowsMediaPlayerClass.
    Le problème étant qu'aucune propriété ne permet de lui affecter un parent. Résultat, la lecture d'une vidéo se fait, mais en invisible.

    Pour ce qui est du DirectX, une fenêtre est automatiquement créé à la première lecture. Ceci pourrait être acceptable si on pouvait contrôler la-dite fenêtre, c'est à dire au moins lui spécifier de rester au dessus du reste de l'application et la fermer par programmation. Mais aucune méthode d'accès ne semble disponible. Il y a bien une propriété Owner sur l'objet Video, mais celle-ci ne supporte qu'un Control (Winform, et non VCL.net) et donc impossible de la renseigner.

    Dans l'idéal, je cherche à afficher la vidéo dans un TPanel, ou un autre composant, peu importe. Tant que je peux contrôler la lecture (play, stop, position). Je souhaite aussi ne pas utiliser de composant nécessitant une installation sur le poste de l'utilisateur.

    Si quelqu'un à une petite piste, cela me serait d'une grande aide ^^.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 86
    Points : 375
    Points
    375
    Par défaut
    Après pas mal d'essais, voici une solution que j'ai finit par trouver.
    Cette solution se base sur l'objet video de DirectX.

    Dans les Uses, il faut déclarer :
    system.Windows.Forms
    microsoft.directx.AudioVideoPlayback (penser à l'ajouter dans les références, nécessite le redistributable trouvable ici si vous ne l'avez pas dans la liste :http://www.microsoft.com/downloads/d...9-ee6407ed1a91 )

    Dans une procedure qui permet d'ouvrir une vidéo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    procedure OpenFile(vFileName:TFileName);
    // VideoForm est une variable global (ou une propriété)
      if not assigned(VideoForm) then
      begin
     
      // Notez qu'on crée ici une form WinForm et pas VCL.net
        VideoForm := form.Create;
      // permet de ne pas voir la form dans la barre des tâches en plus du bouton de l'application hôte
        VideoForm.ShowInTaskbar := false; 
     
      // les deux lignes ci-dessous pour avoir une form sans bordure ni bouton pour fermer. Un simple panneau gris en somme.
       VideoForm.ControlBox := false;
       VideoFOrm.FormBorderStyle := FormBorderStyle.none;
     
      // ici on on définit le parent de la form. dans le cas présent, j'ai créé un composant d'où le Self.Handle.
      // On pourrait utiliser à la place un panel, (panel1.handle)
      Windows.SetParent(THandle(VideoForm.Handle),self.Handle);
      end;
     
      // Initialisation de l'object Microsoft.DirectX.AudioVideoPlayBack.Video
      VideoFile := Video.Create(vFileName,false);
     
      // On lui affecte notre form WinForm en tant que propriétaire.
      // La vidéo sera alors diffusée sur toute la surface de la form
      VideoFile.Owner := VideoForm;
      VideoForm.Show;
     
    // voir plus bas
      ResizeVideoPanel;
    end;
    En l'état, la vidéo est diffusée sur une form contenue dans un control (composant perso, panel...)

    Il ne reste plus qu'à gérer la taille de la vidéo et sa position dans le control hote. La procédure ResizeVideoPanel s'en chargera. Il faudra penser à l'ajouter à un évennement OnResize dans le cas où le control hôte venait à être redimentionné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    procedure ResizeVideoPanel;
    begin
      // Cette procédure étant dans un OnResize, on vérifie que la form existe bien
      if assigned(VideoForm) then
      begin
     
        // On affiche la vidéo en conservant l'aspect ratio et en la centrant dans le control hôte
        if (videoFile.DefaultSize.Width / VideoFile.DefaultSize.Height) > (Width / Height) then
        begin
          VideoForm.Width := Width;
          VideoForm.Height := VideoFile.DefaultSize.Height * VideoForm.Width div VIdeoFile.DefaultSize.Width;
          VideoForm.SetDesktopBounds(0, (Height - VideoForm.Height)div 2,VideoForm.Width,VideoForm.Height);
        end
        else
        begin
          VideoForm.Height := Height;
          VideoForm.Width := VideoFile.DefaultSize.Width * VideoForm.Height div VideoFile.DefaultSize.Height;
          VideoForm.SetDesktopBounds((Width - VideoForm.Width) div 2,0,VideoForm.Width,VideoForm.Height);
        end;
      end;
    end;
    Voilà, je pense ne rien avoir oublié. Comme je l'ai dit j'ai intégré tout ça dans un composant qui intègre toutes les méthodes pour manipuler la vidéo. J'ai extrait le code en le modifiant pour qu'il soit utilisable de façon générale, mais il se peu qu'il y ait quelques erreurs ^^.

    A noter qu'avec ce code on devrait pouvoir lire toutes les vidéos dont le codec est installé sur le poste client.

    Bon coding à vous ^^.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo