Непрерывное воспроизведение видео в медиа-элементе 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 может перестать работать.