[英]High Memory Usage playing MP3's with NAudio on Key Press
我正在使用 C#、WPF 和NAudio 。
当按下某个键时,我会在应用程序exe
播放embedded
资源mp3
。
如果重复按下某个键,RAM 使用量会继续攀升超过 400MB,并且永远不会下降。
即使在调用GC
时,对对象使用Flush()
和Dispose()
似乎也不会释放内存。
当我使用string
路径而不是MemoryStream
从硬盘驱动器上的external
资源播放时,这并没有发生。 它曾经保持在 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
我将字节数组转换回新的流,否则如果同时播放 2 个声音,播放将不会分层并且会崩溃。
那是因为你点击空格键太快了:)
每次按键都会用新值覆盖变量。 因此,当您在几秒钟内单击空格键 10 次时,它将创建 10 个资源。 但是你只引用最后一个创建的。 当 Media_Ended 开始传入时,它将尝试仅处理最新创建的资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.