[WPF] S’amuser avec le MediaElement sous WPF
21 octobre 2006Le contrôle MediaElement que j’ai decouvert au cours de cette semaine a revolutionné ma petite vie de developpeur
Ce contrôle permet de contenir des images, sons ou videos.
Pour charger un media, rien de plus simple :
1 2 | MediaElement monMedia = new MediaElement(); monMedia.Source = new Uri("monURI"); |
Sachant que mon Uri peut pointer sur un fichier local (c:\….) ou distant (http://…..) que se soit une video, une image ou un son….
Le media sera joué immédiatement. Bien que vous disposez des methodes Play(), Stop() et Pause() pour contrôler le media, utilisez plutot la proprieté LoadedBehavior qui permet de definir et/ou obtenir l’etat du media :
1 2 3 | monMedia.LoadedBehavior = MediaState.Pause; //Pause monMedia.LoadedBehavior = MediaState.Stop; //Arret monMedia.LoadedBehavior = MediaState.Play; //Play |
A ce sujet, pour pouvoir jouer une video (ou son) en boucle, la seule doc que j’avais trouvé sur le msdn2 était de mettre un MediaTimeline. Chose un peu tordu dans le code alors qu’il y a une solution toute simple :
1) Abonnez-vous à l’evenement MediaEnded (fin du media) :
1 2 | monMedia.MediaEnded += new RoutedEventHandler(monMedia_MediaEnded); |
2) Remettez la position du media à zero (debut) et relancez le media :
1 2 3 4 5 | void monMedia_MediaEnded(object sender, RoutedEventArgs e) { ((MediaElement)sender).LoadedBehavior = MediaState.Stop; ((MediaElement)sender).Position = new TimeSpan(0); ((MediaElement)sender).LoadedBehavior = MediaState.Play; } |
Ce qui est quand même beaucoup plus simple
C’est bien beau tout ca, mais la vous n’avez aucun apercu à l’ecran ce qui est quand meme un peu dommage ^^ Mais là où ca devient fort bien interressant, c’est qu’un VisualBrush peut prendre en parametre un MediaElement pour pouvoir remplir un rectangle par exemple :
1 2 | Rectangle monRectangle = new Rectangle(); monRectangle.Fill = new VisualBrush(monMedia); |
Et hop la, votre video (par exemple) sera joué dans ce rectangle. Enfin pour rajouter votre rectangle à un canvas que vous aurez au préalable placé dans votre code XAML :
1 | monCanvas.Children.Add(monRectangle); |
A partir de la on peut vraiement s’amuser et aller plus loin dans la démarche.. Par exemple, les rectangles ont une proprieté Clip qui va nous permettre de clipper notre media, OpacityMask pour appliquer un masque d’opacité, et bien d’autre chose pour appliquer differents effets a notre rectangle/video, … Et encore je ne parle que des rectangles, a partir du moment où votre controle pourra etre remplit par un VisualBrush on pourra tout y mettre
Je ne vais pas vous devoiler sur ce quoi je travaille en ce moment, mais il faut bien se rendre compte de tout ce qu’on peut faire avec car c’est carrement dément…
Nom: Sébastien Warin
#1 Leclercq Jean-Christophe
22 février 2009 à 1:05
Thx !
Ca m’a bien servi pour me faire mon petit player :p
#2 xxx
24 mars 2009 à 11:19
Merci !
Ça m’as bien servi à moi aussi
#3 Mathieu
3 mai 2009 à 16:12
Bonjour,
Article très intéressant !
Quelqu’un a-t-il une solution pour jouer un son/vidéo depuis un fichier lié dans les ressources de l’application ?
merci d’avance.
#4 alt157
22 mai 2009 à 9:51
Bonjour,
je trouve l article très intéressant, vraiment bien fait.
Et pour répondre à Matthieu personnellement je créerai le fichier de facon temporaire sur le DD puis je le lirai et a la fin du media je le supprime.
Un petit exemple avec un mp3 :
[code]
string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\test.mp3";
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// recopie le fichier dans les ressources sur le DD
System.IO.File.WriteAllBytes(path, Properties.Resources._04___Entities);
mediaElement1.Source = new Uri(path);
mediaElement1.LoadedBehavior = MediaState.Play;
}
private void mediaElement1_MediaEnded(object sender, RoutedEventArgs e)
{
// libere les ressources
mediaElement1.LoadedBehavior = MediaState.Close;
// supprime le fichier du DD
System.IO.File.Delete(path);
}
[/code]
J espere que cela t aidera.
Merci encore pour l article
#5 souma
19 janvier 2011 à 10:21
merci bcp, ça m’a aidé !!!