高内存使用情况在按键上播放带有NAudio的MP3

时间:2018-03-09 05:06:57

标签: c# audio naudio

我正在使用C#,WPF和NAudio

当按下某个键时,我在应用embedded中播放mp3资源exe

如果反复按下某个键,RAM的使用量将继续超过400MB并且不会下降。

即使调用Flush(),在对象上使用Dispose()GC似乎也不会释放内存。

当我使用external路径而不是string从硬盘驱动器上的MemoryStream资源播放时,这种情况不常发生。它过去常常保持50MB RAM左右。

memory usage

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个声音则会崩溃。

1 个答案:

答案 0 :(得分:1)

这是因为你太快点击空格键:)

每次按键点击都会用新值覆盖变量。因此,当您在几秒钟内单击空格键10次时,它将创建10个资源。但是你只能参考最后创建的一个。当Media_Ended开始传入时,它将尝试仅处理最新创建的资源。