1

我有一个 WPF Caliburn.Micro 应用程序,我使用 MediaPlayer 类来播放音频。我实现了播放、停止和暂停功能,但在 MediaPlayer 中没有看到恢复(暂停后)的方法。你能帮我解决这个问题吗?

这是我的一些代码:

       public void Play()
   {
       try
       {
           var audio = Tpv.GetAudio(SelectedTpv.TpvId);
           var file = Path.GetTempFileName().Replace(".tmp", ".wma");
           File.WriteAllBytes(file, audio);

           Player.Open(new Uri(file, UriKind.Absolute));
           Player.Play();
           IsPlaying = true;

       }
       catch (Exception ex)
       {
           MessageBox.Show(String.Format("Failed to play audio:\n{0}", ex.Message), "Failure",
            MessageBoxButton.OK, MessageBoxImage.Error);

           Console.WriteLine(ex.Message);
       }        
   }

谢谢。

4

1 回答 1

2

我很确定这Play也应该处理恢复功能。根据System.Windows.Media.MediaPlayer的 MSDN,该Play方法应该“从当前位置播放媒体”。这意味着当您从头开始播放媒体时,位置为 0。如果您暂停,则媒体将暂停在某个位置。再次按播放应从您暂停媒体的相同位置恢复播放。

编辑:

根据您提供的代码更新,您的问题似乎是每次单击播放时都在加载文件。这将导致任何先前的暂停信息被删除,并且每次都将文件视为全新的。您应该在那里进行某种检查,以说明如果文件尚未加载,则加载它。否则,您的Play方法应该只调用Player.Play()恢复。

我还要注意,Player.Close当您切换所选项目时,您还需要调用。这将使该Play方法知道它需要加载不同的文件。

public void Play()
{
   try
   {
       // Check if the player already has a file loaded, otherwise load it.
       if(Player.Source == null) { 
           var audio = Tpv.GetAudio(SelectedTpv.TpvId);
           var file = Path.GetTempFileName().Replace(".tmp", ".wma");
           File.WriteAllBytes(file, audio);

           Player.Open(new Uri(file, UriKind.Absolute));
       }

       Player.Play();
       IsPlaying = true;

   }
   catch (Exception ex)
   {
       MessageBox.Show(String.Format("Failed to play audio:\n{0}", ex.Message), "Failure",
        MessageBoxButton.OK, MessageBoxImage.Error);

       Console.WriteLine(ex.Message);
   }        
}
于 2012-09-04T15:23:46.677 回答