我目前正在通过创建钢琴应用程序来打发时间。每个 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(); 但这只能在声音播放完毕后发生,否则会被切断。
有没有办法检查播放的声音是否播放完毕?
我已经花了一些时间进行研究和测试,但我无法想出一个可行的解决方案。
该位置与NaturalDuration性能给你你在(即流在细节Position / NaturalDuration
让你在0.0和1.0之间的值表示播放位置百分比)
但是您可能想要为您的媒体播放构建一个“编排器”。假设您不想同时播放所有声音,协调器可能负责管理媒体播放器的生命周期,并确定它们在播放中的位置。
在您的应用程序中,您可以在启动时创建协调器的单个实例。编排器可以创建和管理一个媒体播放器池,它可以在需要播放和弦时重复使用。然后你的钢琴应用程序可以同时支持一定数量的和弦,并有一个轮询器来确定哪些媒体播放器是空闲的,哪些是“忙”播放音频的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句