繁体   English   中英

高内存使用率在按键时使用 NAudio 播放 MP3

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM