4 votes

WPF : Implémentation d'un MediaPlayer Audio / Video Seeker

Je travaille actuellement sur un lecteur MP3 (dans une application WPF) avec une application WPF MediaPlayer et en fait, je veux implémenter un Song Seeker qui se déplace avec la chanson en cours de lecture.

J'ai déjà mis en place un curseur pour les chansons (à partir de Candidature de Sacha Barber ) et cela fonctionne lorsque l'utilisateur fait glisser le chercheur manuellement (la chanson continue à partir de cette position), mais je n'arrive pas à comprendre comment faire bouger le chercheur en fonction de la position actuelle dans la chanson.

Le problème, c'est que je ne pense pas qu'il y ait un moyen de vérifier quand le Position de la propriété MediaPlayer a changé, et je ne sais donc pas comment mettre en œuvre cette fonctionnalité.

Des idées sur la manière de procéder ?

[Mise à jour]

En ce qui concerne l'incrémentation du seeker avec un timer, j'ai en fait pensé à l'utiliser. La raison pour laquelle je ne l'ai pas encore essayé est que je pense qu'il y a une meilleure façon de l'implémenter en utilisant la fonction MediaTimeline ...mais je n'ai pas encore trouvé comment.

4voto

Alastair Pitts Points 11677

Réveillez-vous, répondez ! et servez votre maître

OK, j'ai trouvé comment faire. Je suis sûr que je ne le fais pas de manière tout à fait correcte, mais cela fonctionne.

Voici le code-behind d'une application WPF, avec un bouton Pause/Play.

public partial class Main : Window
{
    MediaPlayer MPlayer;
    MediaTimeline MTimeline;

    public Main()
    {
        InitializeComponent();

        var uri = new Uri("C:\\Test.mp3");
        MPlayer = new MediaPlayer();
        MTimeline = new MediaTimeline(uri);
        MTimeline.CurrentTimeInvalidated += new EventHandler(MTimeline_CurrentTimeInvalidated);
        MPlayer.Clock = MTimeline.CreateClock(true) as MediaClock;
        MPlayer.Clock.Controller.Stop();
    }

    void MTimeline_CurrentTimeInvalidated(object sender, EventArgs e)
    {
        Console.WriteLine(MPlayer.Clock.CurrentTime.Value.TotalSeconds);
    }

    private void btnPlayPause_Click(object sender, RoutedEventArgs e)
    {
        //Is Active
        if (MPlayer.Clock.CurrentState == ClockState.Active)
        {
            //Is Paused
            if (MPlayer.Clock.CurrentGlobalSpeed == 0.0)
                MPlayer.Clock.Controller.Resume();
            else //Is Playing
                MPlayer.Clock.Controller.Pause();
        }
        else if (MPlayer.Clock.CurrentState == ClockState.Stopped) //Is Stopped
            MPlayer.Clock.Controller.Begin();
    }
}

L'astuce est qu'une fois que vous avez réglé l'horloge d'un MediaPlayer, il devient contrôlé par l'horloge, d'où l'utilisation de MPlayer.Clock.Controller pour faire tout le contrôle :)

0voto

Crippeoblade Points 1301

Je n'ai jamais joué avec le lecteur multimédia, mais en supposant que vous connaissiez la durée de la chanson, ne pourriez-vous pas mettre en place une minuterie qui se déclenche toutes les secondes pendant la lecture de la chanson. Ainsi, à chaque tic-tac, il suffit d'incrémenter le chercheur en fonction de la durée totale de la chanson.

La chanson dure 100 secondes. Par conséquent, chaque seconde/tick vaut 1 % de la progression totale.

Il faudrait arrêter la minuterie lors de la mise en pause d'un morceau, etc...

0voto

Sebastian Gray Points 1137

MediaElement possède une propriété de position que vous pouvez utiliser à cette fin : http://msdn.microsoft.com/en-us/library/system.Windows.controls.mediaelement.position.aspx

0voto

Will Points 76760

Avez-vous consulté le site WPF MediaKit déjà ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X