WPF: реализация MediaPlayer Audio / Video Seeker - PullRequest
4 голосов
/ 15 мая 2009

В настоящее время я работаю на MP3-плеере (в приложении WPF) с WPF MediaPlayer и, в основном, я хочу реализовать Искатель песен, который перемещается вместе с текущей воспроизводимой песней.

Я уже реализовал слайдер песни (из приложения Саши Барбера ), и он работает, когда пользователь перетаскивает искателя вручную (как, например, песня продолжается с этой позиции), но я не могу понять, как ищущий движется в соответствии с текущей позицией в песне.

Проблема в том, что я не думаю, что есть способ проверить, когда свойство Position в MediaPlayer изменилось, поэтому я озадачен тем, как мне реализовать эту функцию.

Есть идеи, как решить эту проблему?

[Update]

Что касается увеличения искателя таймером, я на самом деле думал об использовании причины, по которой я еще не пробовал, потому что я думаю, что есть лучший способ реализовать это с помощью MediaTimeline ... но я еще предстоит выяснить, как.

Ответы [ 4 ]

4 голосов
/ 25 декабря 2009

Возьми ответ! и служить своему хозяину

ОК, я понял, как это сделать. Я уверен, что я делаю это не совсем правильно, но это работает.

Вот код приложения WPF с кнопкой «Пауза / Воспроизведение».

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

Хитрость в том, что как только вы устанавливаете часы MediaPlayer, он становится управляемым часами, таким образом, используя MPlayer.Clock.Controller для выполнения всего управления:)

0 голосов
/ 28 августа 2009

MediaElement имеет свойство position, которое вы можете использовать для этого: http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.position.aspx

0 голосов
/ 19 октября 2009

Вы уже проверили WPF MediaKit ?

0 голосов
/ 16 мая 2009

Никогда не воспроизводился на медиаплеере, но, если вы знаете длину песни, не могли бы вы установить таймер, который срабатывает каждую секунду во время воспроизведения песни. Поэтому для каждого тика просто увеличивайте искателя по отношению к общей длине песни.

Песня длится 100 секунд. Поэтому каждая секунда / тик стоит 1% от общего прогресса.

Вы должны были бы остановить таймер при приостановке песни и т.д ...

...