我正在使用C#,WPF和NAudio。
当按下某个键时,我在应用embedded
中播放mp3
资源exe
。
如果反复按下某个键,RAM的使用量将继续超过400MB并且不会下降。
即使调用Flush()
,在对象上使用Dispose()
和GC
似乎也不会释放内存。
当我使用external
路径而不是string
从硬盘驱动器上的MemoryStream
资源播放时,这种情况不常发生。它过去常常保持50MB RAM左右。
public static MemoryStream ms = null;
public static WaveStream wav = null;
public static WaveOutEvent output = null;
// Embedded Resource sound1.mp3
MemoryStream sound1 = new MemoryStream(Properties.Resources.sound1);
// Key Press
//
if (e.Key == Key.Space) {
ms = new MemoryStream(StreamToBytes(sound1));
wav = new Mp3FileReader(ms);
output = new WaveOutEvent();
output.PlaybackStopped += new EventHandler<StoppedEventArgs>(Media_Ended);
output.Init(wav);
output.Play();
}
// MP3 Playback Ended
//
public static void Media_Ended(object sender, EventArgs e)
{
if (output.PlaybackState == PlaybackState.Stopped)
{
ms.Flush();
ms = null;
wav.Close();
output.Dispose();
}
}
// Convert Stream to Byte Array
//
public static byte[] StreamToBytes(MemoryStream stream)
{
...
}
流到字节数组
https://stackoverflow.com/a/1080445/6806643
我将Byte Array转换回新的Stream,或者播放不会分层,如果同时播放2个声音则会崩溃。
答案 0 :(得分:1)
这是因为你太快点击空格键:)
每次按键点击都会用新值覆盖变量。因此,当您在几秒钟内单击空格键10次时,它将创建10个资源。但是你只能参考最后创建的一个。当Media_Ended开始传入时,它将尝试仅处理最新创建的资源。