Atualmente estou trabalhando em um MP3 player (em um aplicativo WPF) com um MediaPlayer
WPF e, basicamente, eu quero implementar um Song Seeker que se move junto com a música atual.
Eu já implementei um slider de música (do aplicativo de Sacha Barber ) e ele funciona quando o usuário arrasta o buscador manualmente (como em, a música continua daquela posição) mas eu não consigo descobrir como fazer o buscador se mover de acordo com a posição atual a música.
O problema é que eu não acho que há uma maneira de verificar quando a propriedade Position
do MediaPlayer
mudou, então estou perplexo quanto à forma como devo implementar esse recurso.
Alguma idéia de como lidar com esse problema?
[Atualizar]
No que diz respeito ao incremento do buscador com um timer, eu realmente pensei em usar a razão que eu não tentei ainda é porque eu acho que há uma maneira melhor de implementar isso usando o MediaTimeline
… mas eu ainda estou para descobrir como .
RESPONDA resposta! e sirva seu mestre
OK, eu descobri como trabalhar isso. Tenho certeza de que não estou fazendo da maneira correta, mas funciona.
Aqui está o code-behind de um aplicativo WPF, com um botão 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(); } }
O truque é que depois de definir o relógio de um MediaPlayer, ele se torna relógio controlado, assim, o uso de MPlayer.Clock.Controller para fazer todo o controle 🙂
Nunca joguei com o media player, mas supondo que você saiba a duração da música, você não poderia configurar um timer que funcione a cada segundo enquanto a música estiver tocando. Portanto, para cada carrapato, basta incrementar o buscador em relação a quanto tempo a música é no total.
A música tem 100 segundos de duração. Portanto, cada segundo / tick vale 1% do progresso total.
Você teria que parar o cronômetro ao pausar a música, etc …
MediaElement tem uma propriedade de posição que você pode usar para isso: http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.position.aspx
Você já verificou o WPF MediaKit ?