[WPF] S’amuser avec le MediaElement sous WPF
Le 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…
Leclercq Jean-Christophe
Thx !
Ca m’a bien servi pour me faire mon petit player :p
xxx
Merci !
Ça m’as bien servi à moi aussi 🙂
Mathieu
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.
alt157
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 🙂
souma
merci bcp, ça m’a aidé !!!