c# - 高内存使用率,在按键时播放带有NAudio的MP3

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

最佳答案

这是因为您单击空格键的速度太快了:)

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

关于c# - 高内存使用率,在按键时播放带有NAudio的MP3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49186932/

相关文章:

c# - 是否可以在 App.config 文件中的 appSettings 中引用主目录?

audio - 砍伐木材的声音检测

windows - 在 Windows 上使用音频检测进程

c# - C#使用SoundPlayer同时播放多种声音

java - .NET 相当于 Java KeyFactory.getInstance "RSA"/"RSA/ECB/PKCS1Padding"

c# - 使用 .NET 4 和 C# 开发我需要什么版本的 Windows?

c# - NAudio-播放RTP数据包中的音频有效载荷

c# - NAudio - 更改缓冲麦克风音频的音高并发送到虚拟音频线

c# - Entity Framework 不使用更新的连接字符串