Непрерывное воспроизведение видео в медиа-элементе WPF

У меня есть видео файл, воспроизводимый в медиа-элементе. Мне нужно продолжать играть, поэтому я попытался:

me.play();
me.MediaEnded += new RoutedEventHandler(me_MediaEnded);

С помощью этого метода события:

//loop to keep video playing continuously
void me_MediaEnded(object sender, EventArgs e)
{
    //play video again
    me.Play();
}

Однако вышеизложенное не воспроизводит видеофайл. Зачем? Что я сделал не так?

4 ответа

Решение

Согласно посту на MSDN:

Воспроизведение () начинается с текущей позиции, поэтому вы должны сначала перейти на начальную позицию, а затем воспроизвести ее снова.

Таким образом, вы должны сбросить позицию до воспроизведения:

me.Position = TimeSpan.FromSeconds(0);
me.Play();

Вы также можете использовать раскадровку для управления и зацикливания видео без необходимости перехватывать события или выполнять какую-либо работу с выделенным кодом. Это рекомендуемое решение для MSDN и более элегантное и правильное решение для проектирования MVVM.

Узнайте больше о MSDN здесь, включает в себя примеры:

http://msdn.microsoft.com/en-us/library/ms741866%28v=vs.100%29.aspx

Я получил это для работы с этим:

class MyMediaPlayer : MediaPlayer
{
    private bool looping;

    public MyMediaPlayer() : base()
    {
        looping = false;  
        base.MediaEnded += new EventHandler(mediaEnded);
    }

    public MyMediaPlayer(string _file) : base()
    {
        looping = false;
        base.Open(new Uri(_file, UriKind.Relative));
        base.MediaEnded += new EventHandler(mediaEnded);
    }   

    public bool Looping
    {
        get { return looping;}
        set { looping = value; }
    }

    public void playLooping()
    {
        looping = true;
        base.Play();
    }

    public void playLooping(string _file)
    {
        looping = true;
        base.Open(new Uri(_file, UriKind.Relative));
        base.Play();
    }

    public void play()
    {
        looping = false;
        base.Play();
    }

    public void play(string _file)
    {
        looping = false;
        base.Open(new Uri(_file, UriKind.Relative));
        base.Play();
    }

    public void stop()
    {
        looping = false;
        base.Stop();
    }

    private void mediaEnded(object sender, EventArgs e)
    {
        if(looping)
        {
            base.Position = new TimeSpan(0, 0, 0);
            base.Play();
        }
    }

}

Надеюсь, что это ответ на ваш вопрос.

Я не знаю, по какой причине, но для меня это никогда не работало:

me.Position = TimeSpan.FromSeconds(0);
me.Play();

Мой GIF перестает играть после первой итерации.

Я пытался сделать что-то другое, и, похоже, я нашел простое решение:

        <MediaElement 
                        x:Name="me"
                        MediaEnded="MediaElement_MediaEnded"
                        LoadedBehavior="Play" />

Код:

private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
    me.Position = TimeSpan.FromMilliseconds(1);
}

Похоже, если вы установите позицию в ноль, может произойти что-то не так. Метод Play может перестать работать.

Другие вопросы по тегам