我正在通过创建一个钢琴应用程序来度过我的时间。每个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(); 但这应该只在声音播放完毕后才会发生,否则会被切断。
有没有办法检查播放的声音是否已播放完毕?
我已经花了一些时间进行研究和测试,但我无法提出可行的解决方案。
答案 0 :(得分:1)
Position和NaturalDuration属性会为您提供有关您在流中的位置的详细信息(即Position / NaturalDuration
为您提供介于0.0和1.0之间的值,表示播放作为百分比的位置)
但是你可能想建立一个" orchestrator"用于媒体播放。假设您不想同时播放所有声音,协调人可能负责管理媒体播放器的生命周期,并确定播放的位置。
在您的应用程序中,您可以在启动时创建一个orchestrator实例。协调器可以创建和管理一个媒体播放器池,它可以在需要播放和弦时重复使用。那么你的钢琴应用程序可以同时支持一定数量的和弦,并且有一个轮询器可以确定哪些媒体播放器是免费的,哪些是忙碌的"播放音频。