2009-05-15 5 views
2

Je travaille actuellement sur un lecteur MP3 (dans une application WPF) avec un WPF MediaPlayer et je souhaite fondamentalement implémenter un Song Seeker qui se déplace avec le morceau en cours de lecture. J'ai déjà implémenté un curseur de morceau (à partir de Sacha Barber's application) et cela fonctionne quand l'utilisateur traîne le chercheur manuellement (comme dans, la chanson continue de cette position) mais je n'arrive pas à comprendre comment faire bouger le chercheur selon le courant position dans la chanson.WPF: Implémentation d'un Seeker audio/vidéo MediaPlayer

Problème est je ne pense pas qu'il y ait un moyen de vérifier lorsque la propriété Position du MediaPlayer a changé, donc je suis perplexe quant à la façon dont je devrais implémenter cette fonctionnalité.

Des idées sur la façon de résoudre un tel problème?

[Mise à jour]

En ce qui concerne incrémenter le demandeur d'une minuterie, en fait je pensais d'utiliser la raison pour laquelle je n'ai pas essayé est encore parce que je pense qu'il ya une meilleure façon de mettre en œuvre cette aide de la MediaTimeline ... mais je suis encore à comprendre comment.

+1

Avez-vous eu un peu de chance avec cela puisque vous l'avez posté en mai? Je serais intéressé par votre solution. Je viens d'utiliser une minuterie pour déplacer le curseur, mais il interfère avec glisser pour définir la position actuelle. –

Répondre

3

ARISE réponse! et servir votre maître

OK, j'ai compris comment travailler. Je suis sûr que je ne le fais pas tout à fait correct mais ça marche.

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

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 réglez l'horloge d'un MediaPlayer, elle devient une horloge contrôlée, donc l'utilisation de MPlayer.Clock.Controller à faire tout le contrôle :)

0

Jamais joué avec un lecteur multimédia, mais en supposant que vous connaissiez la longueur de la chanson, vous ne pouvez pas configurer une minuterie qui se déclenche toutes les secondes pendant la lecture de la chanson. Par conséquent, pour chaque tick, il suffit d'incrémenter le chercheur par rapport à la longueur totale de la chanson.

Le morceau dure 100 secondes. Par conséquent, chaque seconde/tick vaut 1% du progrès total.

Il faudrait arrêter le chronomètre en pause chant etc ...