C#WPF调用Windows Media Player

时间:2017-07-14 19:29:06

标签: c# wpf wmp

我正在通过创建一个钢琴应用程序来度过我的时间。每个Key都表示一个简单的按钮,其中有一个命令可以在点击时触发。这导致在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(); 但这应该只在声音播放完毕后才会发生,否则会被切断。

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

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

1 个答案:

答案 0 :(得分:1)

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

但是你可能想建立一个" orchestrator"用于媒体播放。假设您不想同时播放所有声音,协调人可能负责管理媒体播放器的生命周期,并确定播放的位置。

在您的应用程序中,您可以在启动时创建一个orchestrator实例。协调器可以创建和管理一个媒体播放器池,它可以在需要播放和弦时重复使用。那么你的钢琴应用程序可以同时支持一定数量的和弦,并且有一个轮询器可以确定哪些媒体播放器是免费的,哪些是忙碌的"播放音频。