在WPF媒体元素中连续重复播放视频

3

我有一个视频文件在媒体元素中播放。我需要让它继续播放,因此我尝试了以下操作:

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个回答

12
根据在MSDN上的一篇帖子:(点击此处阅读)

Play()方法从当前位置开始播放,因此您必须先回到起始位置,然后再重新播放。

所以您必须在重新播放之前重置位置:

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

1
对我来说起作用了,但只有在我将LoadedBehavior更改为手动后才有效。 - bogdanbujdea

2

我用以下方法解决了这个问题:

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

}

希望这回答了你的问题。

2
我不知道原因,但这个GIF永远无法正常工作:
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);
}

使用1毫秒可使播放正常,而0毫秒可能会停止播放,您将无法使用“播放”方法再次运行它。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接