WPF: Implementazione di un MediaPlayer Audio / Video Seeker
-
22-08-2019 - |
Domanda
Attualmente sto lavorando su un lettore MP3 (in un'applicazione WPF) con un WPF MediaPlayer
e in fondo, voglio realizzare un Cercatore canzone che si muove lungo con il brano in riproduzione.
Ho già implementato un cursore brano (da applicazione Sacha Barber) e funziona quando l'utente trascina il cercatore manualmente (come in, la canzone continua da quella posizione) ma non riesco a capire come far muovere richiedente secondo alla posizione corrente nella canzone.
Il problema è che non credo che ci sia un modo per verificare se il Position
proprietà della MediaTimeline
è cambiato, quindi sono perplesso su come avrei dovuto implementare questa funzione.
Tutte le idee su come andare su un tale problema?
[Aggiornamento]
Per quanto riguarda l'incremento del ricercatore con un timer, in realtà ho pensato di usare la ragione per cui non ho provato ancora è perché penso che ci sia un modo migliore per implementare questo utilizzando il <=> ... ma sono ancora da capire come.
Soluzione
ARISE risposta! e servire il vostro padrone
OK, ho capito come funziona in questo. Sono sicuro che non sto facendo nel modo del tutto corretto, ma funziona.
Ecco il code-behind di un'applicazione WPF, con un pulsante Pausa / 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();
}
}
Il trucco è che una volta impostato l'orologio di un MediaPlayer, diventa controllato l'orologio, così l'uso di MPlayer.Clock.Controller a fare tutto il controllo:)
Altri suggerimenti
non ha mai giocato con i media player, ma a patto di saper la lunghezza del brano si fa a non impostare un timer che zecche ogni secondo mentre il brano è in riproduzione. Quindi per ogni tick solo incrementare il ricercatore in relazione a quanto tempo la canzone è in totale.
Song è lunga 100 secondi. Pertanto ogni secondo / tick vale 1 per cento del progresso totale.
Dovreste fermare il timer quando la pausa canzone ecc ...
MediaElement ha una proprietà posizione che si potrebbe usare per questo: http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.position.aspx
Hai controllato la WPF MediaKit ancora?