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

C++Builder Discussion :

Fluidifier la lecture Vidéo dans un TMediaPlayer


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut Fluidifier la lecture Vidéo dans un TMediaPlayer
    Bonjour à tous

    Existe-t-il des méthodes pour fluidifier la lecture de vidéo avec le composant TMediaPlayer.

    J'ai recréé moi même une bare de bouton pour MediaPlayer me fournissant des fonctions que la bare classique ne me fournit pas, notamment, le retour rapide et la lecture arrière.

    Or je me suis rendu compte que en retour rapide et lecture arrière, cela saccade horriblement.

    Voici les méthodes déclancher par mes boutons RetourRapide et LectureArriere :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
     
     
    //---------------------------------------------------------------------------
    // Méthode déclancher lorsque l'on clique sur le bouton Retour Rapide du PanelMedia
    void __fastcall TGameForm::RetourRapideClick(TObject *Sender)
    {
            // booléen pour marquer le premier passage
            bool PremierPassage = true;
            // S'il y a lecture
            ArreterLectureMessageVideo();
            // Si l'on est déjà en mode Retour Rapide
            if(ModeMessageVideo == 2)
            {
                    // On marque que l'on est en pause
                    ModeMessageVideo = 5;
                    // On sélectionne le bouton Pause
                    Pause->Down = true;
            }
            // Sinon
            else
            {
                    // On se met en mode d'affichage Retour Rapide
                    ModeMessageVideo = 2;
                    MediaPlayer1->Frames = 1;
                    // On marque que l'on est en lecture dans un message vidéo
                    LectureMessageVideo = true;
                    while(LectureMessageVideo)
                    {
                            // On recule
                            MediaPlayer1->Back();
                            Application->ProcessMessages();
                            // Si l'on est dans le premier passage
                            if(PremierPassage)
                            {
                                    // Si le bouton Pause n'est pas activé
                                    if(!Pause->Enabled)
                                    {
                                            // On l'active
                                            Pause->Enabled = true;
                                    }
                                    // Si le bouton ImageParImageAvant est inactif
                                    if(!ImageParImageAvant->Enabled)
                                    {
                                            // On l'active
                                            ImageParImageAvant->Enabled = true;
                                    }
                                    // Si le bouton Lecture n'est pas activé
                                    if(!Lecture->Enabled)
                                    {
                                            // On l'active
                                            Lecture->Enabled = true;
                                    }
                                    // Si le bouton Avance rapide est inactif
                                    if(!AvanceRapide->Enabled)
                                    {
                                            // On l'active
                                            AvanceRapide->Enabled = true;
                                    }
                                    // Si le bouton Fin n'est pas activé
                                    if(!Fin->Enabled)
                                    {
                                            // On l'active
                                            Fin->Enabled = true;
                                    }
                                    // On marque que l'on n'est plus dans le premier passage
                                    PremierPassage = false;
                            }
                            // Si on a attent le début de la vidéo
                            if(MediaPlayer1->Position == 0)
                            {
                                    // On interropt la lecture
                                    ArreterLectureMessageVideo();
                                    // On désélectionne le bouton LectureArriere
                                    LectureArriere->Down = false;
                                    // On sélectionne le bouton Debut
                                    Debut->Down = true;
                                    // SI le bouton lecture arrière est actif
                                    if(LectureArriere->Enabled)
                                    {
                                            // On le désactive
                                            LectureArriere->Enabled = false;
                                    }
                                    // Si le bouton Image Par Image Arrière est actif
                                    if(ImageParImageArriere->Enabled)
                                    {
                                            // On le désactive
                                            ImageParImageArriere->Enabled = false;
                                    }
                                    // Si le bouton Pause est actif
                                    if(Pause->Enabled)
                                    {
                                            // On le désactive
                                            Pause->Enabled = false;
                                    }
                                    // On désactive le bouton Retour Rapide
                                    RetourRapide->Enabled = false;
                            }
                    }
            }
    }
    //---------------------------------------------------------------------------
    // Méthode déclancher lorsque l'on clique sur le bouton Lecture Arrière du PanelMedia
    void __fastcall TGameForm::LectureArriereClick(TObject *Sender)
    {
            // booléen pour marquer que l'on est dans le premier passage
            bool PremierPassage;
            // timer
            TTimer *TimerMessageVideo = new TTimer(GameForm);
            // On définit l'intervalle pour le timer
            TimerMessageVideo->Interval = 25;
            // On définit la méthode que déclanche le timer
            TimerMessageVideo->OnTimer = OnTimerMessageVideo;
            // S'il y a lecture
            ArreterLectureMessageVideo();
            // S'il on est déja en mode LectureArrière
            if(ModeMessageVideo == 4)
            {
                    // On marque que l'on passe en mode Pause
                    ModeMessageVideo = 5;
                    // On désélectionne le bouton LectureArriere
                    LectureArriere->Down = false;
                    // On sélectionne le bouton Pause
                    Pause->Down = true;
            }
            // Sinon on n'est pas en mode LectureArriere
            else
            {
                    // On se met en mode d'affichage Lecture Arriere
                    ModeMessageVideo = 4;
                    MediaPlayer1->Frames = 1;
                    // On marque que l'on est en lecture dans un message vidéo
                    LectureMessageVideo = true;
                    while(LectureMessageVideo)
                    {
                            // On recule
                            MediaPlayer1->Back();
                            // On se met en attente de lecture
                            AttenteMessageVideo = true;
                            // On active le timer
                            TimerMessageVideo->Enabled = true;
                            while(AttenteMessageVideo)
                            {
                                    Application->ProcessMessages();
                            }
                            // On désactive le timer
                            TimerMessageVideo->Enabled = false;
                            // Si l'on est dans le premier passage
                            if(PremierPassage)
                            {
                                    // Si le bouton Pause n'est pas activé
                                    if(!Pause->Enabled)
                                    {
                                            // On l'active
                                            Pause->Enabled = true;
                                    }
                                    // Si le bouton ImageParImageAvant est inactif
                                    if(!ImageParImageAvant->Enabled)
                                    {
                                            // On l'active
                                            ImageParImageAvant->Enabled = true;
                                    }
                                    // Si le bouton Lecture n'est pas activé
                                    if(!Lecture->Enabled)
                                    {
                                            // On l'active
                                            Lecture->Enabled = true;
                                    }
                                    // Si le bouton Avance rapide est inactif
                                    if(!AvanceRapide->Enabled)
                                    {
                                            // On l'active
                                            AvanceRapide->Enabled = true;
                                    }
                                    // Si le bouton Fin n'est pas activé
                                    if(!Fin->Enabled)
                                    {
                                            // On l'active
                                            Fin->Enabled = true;
                                    }
                                    // On marque que l'on est plus dans le premier passage
                                    PremierPassage = false;
                            }
                            // Si on a attent la fin de la vidéo
                            if(MediaPlayer1->Position == 0)
                            {
                                    // On interrompt la lecture
                                    ArreterLectureMessageVideo();
                                    // On sélectionne le bouton Début
                                    Debut->Down = true;
                                    // SI le bouton Retour Rapide est actif
                                    if(RetourRapide->Enabled)
                                    {
                                            // On le désactive
                                            RetourRapide->Enabled = false;
                                    }
                                    // Si le bouton Image Par Image Arrière est actif
                                    if(ImageParImageArriere->Enabled)
                                    {
                                            // On le désactive
                                            ImageParImageArriere->Enabled = false;
                                    }
                                    // Si le bouton Pause est actif
                                    if(Pause->Enabled)
                                    {
                                            // On le désactive
                                            Pause->Enabled = false;
                                    }
                                    // On désactive le bouton Lecture Arriere
                                    LectureArriere->Enabled = false;
                            }
                    }
            }
    }
    //---------------------------------------------------------------------------
    Merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    Je ne connait pas ce composant pour ne l'avoir jamais utilisé, mais si tu joue sur ton échantillonnage (ton timer TimerMessageVideo) tu devrais pouvoir régler ce "saccadement".
    As tu essayés ca?

  3. #3
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    C'est ce que je pense mais étant donné que je n'arrive pas à connaitre la fréquence d'échantillonnage de la vidéo, je ne peut donc pas le réglé en conséquence. De plus, je me suis aperçu que pour une même vidéo (compressé et non compressé), quand elle n'est pas compressé, je n'ai pas de saccade).

    De plus et c'est ce qui n'étonne, pour la fonction RetourRapide, c'est rigoureusement la même fonction que AvanceRapide (sauf qu'au lieu d'avancé, on recule) et la fonction AvanceRapide fonctionne correctement alors que RetourRapide non.

  4. #4
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Je ne connait pas le mode de chargement de médiaplayer, mais peut être que pour un fonctionnement normal, il doit charger dans un buffer les images suivantes (dans le sens de lecture classique). Ce qui fait que pour une avance rapide, tu saccaderas moins que pour un retour, les images étant plus rapidement chargé du buffer à la vidéo.
    Cela pourrait expliquer le problème, quant à le résoudre ....
    si ta vidéo est compressé, le taux d'image par seconde est plus faible que pour une vidéo non compressé, je pense.
    Tu avais déjà mis un post à ce sujet?
    Il me semble t'avoir répondu pour la fréquence d'échantillonnage?
    N'existe t-il pas un secteur dans le fichier comprenant cette fréquence d'échantillonnage, sinon comment fais médiaplayer?

  5. #5
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    J'ai pas fait attention à ta réponse, je vais aller voir ça. Merci

  6. #6
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Est-ce que tu saurais comment récupérer cette fréquence car je ne sais pas comment faire.

  7. #7
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Je sais que j'ai lu un post une fois, ou la solution était de lire l'entête d'un fichier pour en connaître son format (dans le cas où il n'y a pas d'extension).
    Par contre, je vient de trouver ca sur les API Windows qui pourraît peut être t'intéresser:
    http://msdn.microsoft.com/library/de...e50lrfrate.asp
    Fouille peut être de ce côté sinon.

  8. #8
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Merci pour ton aide je vais regarder ça

  9. #9
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    En fait je n'y ai pas pensé mais j'ai utiliser AviFileInfo pour récupérer la taille de ma vidéo (hauteur et largeur) pour un autre module de mon programme et il est possible avec avifileinfo de récupéré également la fréquence.

    Donc pour ça c'est résolu.

    Récupérer la fréquence d'échantillonage de ma 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
     
          PAVIFILE FichierAVI;
          AVIFILEINFO InfoFichierAvi;
     
          MediaPlayer->FileName = CheminVideo;
          MediaPlayer->Open();
     
          // On initialise
          AVIFileInit();
     
          // On ouvre le fichier
          AVIFileOpen(&FichierAvi, CheminVideo.c_str(), OF_SHARE_DENY_WRITE,NULL);
     
          // On récupère les info concernant le fichier
          AVIFileInfo(FichierAvi,&InfoFichierAvi,sizeof(InfoFichierAvi));
     
          // On calcule la fréquence d'échantillonage de la vidéo
          Frequence = InfoFichierAvi.dwRate / InfoFichierAvi.dwScale;
     
          // On ferme le fichier
          AVIFileRelease(FichierAvi);
     
          //On ferme la bibliothèque AVI
          AVIFileExit();
    Ensuite il me suffit de réglér mon timer pour que la vidéo se lise à la bonne f'équence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Timer->Intervall = 1000 / Frequence;
    Par contre je n'ai toujours pas trouver comment fluidifier la lecture arrière pour une vidéo compressé. Pour une vidéo non compressé, aucun problème.

  10. #10
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    A ce moment, il faut voir la différence entre un fichier compressé, et un non compressé.

    Lorsque tu fais une lecture arrière sur ton fichier non compressé, à quelle vitesse lis-tu? est-ce la même vitesse pour le fichier compressé? Essaie de voir s'il n'existe pas un rapport?

  11. #11
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    En fait, j'ai l'impression que pour que la vidéo soit fluide lorsqu'elle est compressé, le médiaplayer met en cache les images suivantes. Là, vu que je lis en arrière, il n'y a pas de cache, c'est pour cela je pense que ma lecture est saccadé.

    Pour la lecture arrière, je lis maintenant à la fréquence d'échantillonage de la vidéo qu'elle soit compressé ou non.

    Pour le retour rapide également, cela ne va pas quand la vidéo est compressé, ca recule très lentements.

  12. #12
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    C'est malheureusement mon point de vue aussi (voir message #4). Et j'ai bien peur que modifier la mémoire cache soit risqué. Attention, je n'ai pas dis que cela n'était pas possible, mais déjà que ca dépassé mes compétences, là je sens un risque à modifier la mémoire chache. De plus il se peut qu'en faisant cette opération, tu écrases d'autres paramètres qui seraient utile au mediaplayer et que tu dégrades ton fonctionnement.

    Tu peux toujours essayer, j'ai vu sur ce site la structure de la mémoire cache. A toi de voir si tu veux tenter, si oui je reste toujours là au cas ou.
    Bon courage

  13. #13
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    En fait pour l'instant, on n'a pas trouver d'autre alternative de changer le codec de compression avec virtualdub et on en a trouver un ou ca fonctionne mais la taille de la vidéo en est d'autant plus grande.

    En tout cas, merci pour ton aide

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 273
    Points : 628
    Points
    628
    Par défaut Qualité vidéo
    Je suis confronté à un pb similaire : plus généralement comment gérer une vidéo de bonne qualité sur Builder ? TMediaPlayer est assez limté et ne permet pas l'accès aux formats wmv (Windows Media v9 & 10) ou mov (QuickTime). Il existe bien une activeX QuickTime importable dans Builder mais non documentée. La solution pourrait être dans l'utilisation de l'api Media player. Son utilisation semble assez complexe. Je poursuit mes recherches dans ce sens.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Alternative à TMediaPlayer
    Il est possible d'installer Windows Media Player dans la barre de composants par le menu Composant _ Installer un contrôle ActiveX.
    On a alors accès aux propriétés et évènements dans l'inspecteur d'objets de Builder. On dispose aussi des méthodes et autres, décrites chez Microsoft :
    http://msdn2.microsoft.com/en-us/library/aa392418.aspx
    Si quelqu'un est intéressé...

    Par contre, j'ai un petit problème indépendant de cet ActiveX :
    Je n'arrive pas à utiliser les fonctions AVI de l'API Windows. Lorsque j'écris
    AVIFileInit();
    le compilateur me donne une erreurE2268 : appel à une fonction non définie.
    (je suis en Builder 5.0 pack1)
    Il doit y avoir un include à rajouter, mais lequel ?

  16. #16
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    On m'avais parlé de l'activx mais je ne savais pas comment l'installé.

    Merci

    Pour AvifileInfo, il faut


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

Discussions similaires

  1. Lecture vidéo couche alpha dans flash
    Par LoGGi dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 10/11/2014, 09h32
  2. Lecture d'un flux vidéo dans une winform
    Par Nicox11 dans le forum C#
    Réponses: 1
    Dernier message: 23/04/2014, 15h00
  3. lecture vidéo dans PP sur un autre PC
    Par Fener dans le forum Powerpoint
    Réponses: 4
    Dernier message: 14/06/2010, 10h46
  4. Problème de lecture vidéo dans PPS
    Par Claude_Azoulai dans le forum Powerpoint
    Réponses: 1
    Dernier message: 15/07/2009, 18h19
  5. Lecture Arrière dans un TMediaPlayer
    Par kurul1 dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/04/2006, 12h01

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