C# 如何使用NAudio从嵌入式资源播放WAV文件?

C# 如何使用NAudio从嵌入式资源播放WAV文件?,c#,naudio,C#,Naudio,我正在使用C#、WPF和播放wav文件 我在参考资料文件夹中有sound_1.wav,并包含在项目中。编译后,它将exe和资源导出到文件夹,并从硬盘上的路径播放wav string sound1 = "Resources\\sound_1.wav"; NAudio.Wave.WaveFileReader wav = new NAudio.Wave.WaveFileReader(sound1); WaveOutEvent output = new WaveOutEvent(); output.I

我正在使用C#、WPF和播放
wav
文件

我在参考资料文件夹中有
sound_1.wav
,并包含在项目中。编译后,它将exe和资源导出到文件夹,并从硬盘上的路径播放wav

string sound1 = "Resources\\sound_1.wav";

NAudio.Wave.WaveFileReader wav = new NAudio.Wave.WaveFileReader(sound1);
WaveOutEvent output = new WaveOutEvent();
output.Init(wav);
output.Play();

但是我想将
wav
文件嵌入
exe
中,并使用如下内容:

UnmanagedMemoryStream sound1 = Properties.Resources.sound_1; //embedded resource
NAudio.Wave.WaveFileReader wav = new NAudio.Wave.WaveFileReader(sound1);

如何通过WaveileReader播放?它只接受
字符串
路径


解决 这是可行的,但声音以慢动作播放,听起来像混响

UnmanagedMemoryStream sound1 = Properties.Resources.sound_1;

WaveIn wavin = new WaveIn();
NAudio.Wave.RawSourceWaveStream wav = new NAudio.Wave.RawSourceWaveStream(sound1, wavin.WaveFormat);         
WaveOutEvent output = new WaveOutEvent();
output.Init(wav);
output.Play();

这适用于声音结束时的大声弹出

将流转换为字节数组


我找到了让它工作的方法

此解决方案的问题是内存使用率高

WAV
你试过了吗?@PaulF它似乎仍然需要一个字符串路径。我不确定你的意思-WaveFileReader接受流作为构造函数-这可以是从字节数组创建的MemoryStream。您可以通过提取嵌入的资源来创建字节数组。@PaulF它们使用
字符串文件名
。当我将其更改为
UnmanagedMemoryStream filename
以提取嵌入的资源时,它仍然需要
String
才能提取
a.GetManifestResourceStream(filename)
@Mattmcanis:将sound1传递给GetManifestResourceStream,就像第一个链接PaulF(Rotem接受的答案)中那样,难道不管用吗已提供?您可能需要为每个流实例调用Dispose,因为它们都实现IDisposable。@PaulF我尝试在
Media\u end()
中调用
Close()
Dispose()
。这样它就不会在播放时关闭声音。但是内存使用率从来没有下降过。是的,我可以在每次按键后将它放入
Media\u Ended()
,但这太过分了。没什么区别。这里的黄线显示何时调用GC。还可以尝试将输出设置为null,并清除停止的事件处理程序,这可能会使wave out保持活动状态,从而使输入保持活动状态stream@MarkHeath如何清除已停止的事件处理程序?它说,如果我执行
output.PlaybackState=null
,则它是只读的。
byte[] b = ReadToEnd(sound1);

WaveStream wav = new RawSourceWaveStream(new MemoryStream(b), new WaveFormat(44100, 16, 2));
WaveOutEvent output = new WaveOutEvent();
output.Init(wav);
output.Play();
// embedded resource sound.wav

UnmanagedMemoryStream sound = Properties.Resources.sound;

MemoryStream ms = new MemoryStream(StreamToBytes(sound));

WaveStream ws = new WaveFileReader(ms);

WaveOutEvent output = new WaveOutEvent();

output.PlaybackStopped += new EventHandler<StoppedEventArgs>(Media_Ended);
output.Init(ws);
output.Play();
// embedded resource sound.mp3

MemoryStream sound = new MemoryStream(Properties.Resources.sound);

MemoryStream ms = new MemoryStream(StreamToBytes(sound));

WaveStream ws = new Mp3FileReader(ms);

WaveOutEvent output = new WaveOutEvent();

output.PlaybackStopped += new EventHandler<StoppedEventArgs>(Media_Ended);
output.Init(ws);
output.Play();
public static void Media_Ended(object sender, EventArgs e)
{
    if (output.PlaybackState == PlaybackState.Stopped)
    {
        if (ms != null)
        {
            ms.Close();
            ms.Flush();
        }
        if (ws != null)
        {
            ws.Close();
        }
        if (output != null)
        {
            output.Dispose();
        }
    }
}