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