2009-05-15 18 views
2

Ich arbeite gerade an einem MP3-Player (in einer WPF-Anwendung) mit einem WPF MediaPlayer und grundsätzlich möchte ich einen Song Seeker implementieren, der sich mit dem aktuell spielenden Song bewegt.WPF: Implementieren eines MediaPlayer Audio/Video Seeker

Ich habe bereits einen Song-Slider implementiert (von Sacha Barber's application) und es funktioniert, wenn der Benutzer den Sucher manuell zieht (wie in, der Song geht von dieser Position), aber ich kann nicht herausfinden, wie man den Sucher entsprechend der aktuellen bewegen Position im Lied.

Problem ist, ich glaube nicht, es gibt eine Möglichkeit zu überprüfen, wenn die Position Eigenschaft der MediaPlayer hat sich geändert, so bin ich ratlos, wie ich diese Funktion implementieren sollte.

Irgendwelche Ideen, wie man so ein Problem angeht?

[Update]

Was mit einem Timer den Sucher erhöht wird, dachte ich eigentlich den Grund der Verwendung ich es nicht versucht noch, weil ich denke, dass es einen besseren Weg, dies mit dem implementieren MediaTimeline ... aber ich muss noch herausfinden, wie.

+1

Haben Sie Glück gehabt seit du es im Mai gepostet hast? Ich wäre an Ihrer Lösung interessiert. Ich habe gerade einen Timer verwendet, um den Schieberegler zu bewegen, aber dann stört es das Ziehen, um die aktuelle Position festzulegen. –

Antwort

3

ARISE Antwort! und diene deinem Master

OK, ich habe herausgefunden, wie man das funktioniert. Ich bin mir sicher, dass ich es nicht komplett korrekt mache, aber es funktioniert.

Hier ist der Code hinter einer WPF-Anwendung mit einer Pause/Play-Taste.

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(); 
    } 
} 

Der Trick besteht darin, dass, wenn Sie die Uhr von einem Mediaplayer gesetzt, wird es Uhr gesteuert, wodurch die Verwendung von MPlayer.Clock.Controller alle der Kontrolle :)

0

Wurde nie mit dem Media Player abgespielt, aber vorausgesetzt, Sie kennen die Länge des Songs, können Sie keinen Timer einstellen, der jede Sekunde während der Wiedergabe des Songs tickt. Zählen Sie daher für jeden Tick den Sucher in Bezug auf die Gesamtlänge des Songs.

Song ist 100 Sekunden lang. Daher ist jede Sekunde/Tick 1 Prozent des gesamten Fortschritts wert.

Sie müssen den Timer stoppen würde, wenn Lied usw. Pause ...