我正在使用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个声音,则会崩溃。
最佳答案
这是因为您单击空格键的速度太快了:)
每次按键单击都会用新值覆盖变量。因此,当您在几秒钟内单击空格键10次时,它将创建10个资源。但是您仅引用创建的最后一个。当Media_Ended将开始传入时,它将尝试仅处置最新创建的资源。
关于c# - 高内存使用率,在按键时播放带有NAudio的MP3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49186932/