C# WPF 调用 Windows 媒体播放器

C# WPF Invoking Windows Media Player

我目前正在创建一个钢琴应用程序来打发时间。每个键都代表一个简单的按钮,带有一个在单击时触发的命令。这导致在 ViewModel 中执行此方法:

    private void PlaySound(object parameter)
    {
        var mediaPlayer = new MediaPlayer();
        mediaPlayer.Open(new System.Uri(@SoundBar.GetSoundPathByIdent(int.Parse(parameter.ToString()))));
        mediaPlayer.Play();
    {

我认为问题在于 MediaPlayer 留下了一个 WeakReference,它阻止了 GarbageCollector 收集它。玩了一段时间后导致内存过载。

我找到的解决方案是调用:mediaPlayer.Close(); 但这应该只发生在声音播放完之后,否则会被切掉。

有没有办法检查播放的声音是否播放完毕?

我已经花了一些时间进行研究和测试,但我无法提出可行的解决方案。

Position and NaturalDuration 属性为您提供有关您在流中的位置的详细信息(即 Position / NaturalDuration 为您提供一个介于 0.0 和 1.0 之间的值,以百分比表示播放位置)

但您可能想要为您的媒体播放构建一个 "orchestrator"。假设您不想同时播放所有声音,编排器可能会负责管理媒体播放器的生命周期,并确定它们在播放中的位置。

在您的应用程序中,您可以在启动时创建协调器的单个实例。编排器可以创建和管理一个媒体播放器池,它可以在需要播放和弦时重复使用。然后您的钢琴应用程序可以同时支持一定数量的和弦,并有一个轮询器来确定哪些媒体播放器是空闲的,哪些正在 "busy" 播放音频。