【问题标题】:Replaying a video continuously in a WPF media element在 WPF 媒体元素中连续重播视频
【发布时间】:2013-11-15 12:11:35
【问题描述】:

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

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

但是,以上内容不会重播视频文件。为什么?我做错了什么?

【问题讨论】:

    标签: c# wpf event-handling mediaelement replay


    【解决方案1】:

    根据post on MSDN

    Play() 从当前位置开始,所以你必须先到开始的地方再播放一次。

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

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

    【讨论】:

    • 为我工作,但只有在我将 LoadedBehavior 更改为 Manual 之后
    【解决方案2】:

    您还可以使用 Storyboard 来控制和循环播放视频,而无需挂钩事件或执行任何代码隐藏工作。这是 MSDN 上推荐的解决方案,对于 MVVM 设计来说是一个更优雅、更合适的解决方案。

    在此处阅读有关 MSDN 的更多信息,包括示例:

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

    【讨论】:

      【解决方案3】:

      我得到了它的工作:

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

      希望这能回答你的问题。

      【讨论】:

        【解决方案4】:

        我不知道原因,但这对于我来说从来没有用过 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 毫秒可能会停止播放,您无法使用“播放”方法再次运行它。

        【讨论】:

          猜你喜欢
          • 2021-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多