简体   繁体   English

C#MediaPlayer.MediaEnded事件未触发

[英]C# MediaPlayer.MediaEnded event not firing

i have this little piece of C# code 我有这小段C#代码

//Creates a MediaPlayer with the sound you want to play
    public static void PlaySound (Stream wavStream, string wavName, bool loop)
    {
        //Get the path for the file to play
        var path = GetFilePath(wavStream, wavName);

        var player = new MediaPlayer();
        player.Open(new Uri(path));
        player.MediaEnded += loop ? new EventHandler(MediaEndedLoop) : new EventHandler(MediaEndedDestroy);
        player.Play();

        players.Add(player);
        names.Add(wavName);
    }

I dont know why but MediaEndedLoop and MediaEndedDestroy are never called 我不知道为什么,但是从不调用MediaEndedLoop和MediaEndedDestroy

Any idea? 任何想法?

I also had this problem. 我也有这个问题。 I couldn't find a solution, but I did come up with a workaround if your media exists in a looping application or thread. 我找不到解决方案,但是如果您的媒体存在于循环的应用程序或线程中,我确实想出了一种解决方法。 You can just manually reset the position after a certain point. 您只需在特定点之后手动重置位置即可。

if (media.Position > new TimeSpan(0, 2, 25))
      {
          media.Position = new TimeSpan(0, 0, 00);
      }

That's the best I can offer as of now. 到目前为止,这是我能提供的最好的服务。

The MediaPlayer requires a Dispatcher in order to dispatch the MediaEnded , MediaOpened ... events. MediaPlayer需要Dispatcher才能分派MediaEndedMediaOpened ...事件。

When you are using a WinForm application a Dispatcher should already have been registered. 当您使用WinForm应用程序时,应该已经注册了Dispatcher That means that you should not have to do anything to get the events working. 这意味着您无需执行任何操作即可使事件正常运行。

If you want to receive events in a console application you'll have to run the Dispatcher yourself. 如果要在控制台应用程序中接收事件,则必须自己运行Dispatcher

public static void Main (string[] args)
{
  var mediaPlayer = new MediaPlayer();
  mediaPlayer.MediaEnded += (sender, eventArgs) => Console.WriteLine ($"ended.");
  mediaPlayer.MediaOpened += (sender, eventArgs) => Console.WriteLine ($"started.");
  mediaPlayer.MediaFailed += (sender, eventArgs) => Console.WriteLine ($"failed: {eventArgs.ErrorException.Message}");
  mediaPlayer.Changed += (sender, eventArgs) => Console.WriteLine ("changed");

  mediaPlayer.Open (new Uri (@"S:\custom.mp3"));
  mediaPlayer.Play();

  Dispatcher.Run();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM