簡體   English   中英

在 WPF 媒體元素中連續重播視頻

[英]Replaying a video continuously in a WPF media element

我有一個在媒體元素中播放的視頻文件。 我需要讓它繼續播放,因此我嘗試了:

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

但是,以上不會重放視頻文件。 為什么? 我做錯了什么?

根據MSDN上的帖子

Play() 從當前位置開始,因此您必須先到起始位置,然后再播放。

所以你必須在重播之前重置位置:

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

您還可以使用 Storyboard 來控制和循環視頻,而無需掛鈎事件或執行任何代碼隱藏工作。 這是 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();
        }
    }

}

希望這能回答你的問題。

我不知道原因,但這對我來說從來沒有用過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 毫秒可能會停止播放,您無法使用“播放”方法再次運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM