【发布时间】:2018-08-17 02:27:15
【问题描述】:
我正在使用 C#、WPF 和 NAudio 播放 wav 文件。
我在 Resources 文件夹中有 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();
但我想在exe 中嵌入wav 文件并使用类似:
UnmanagedMemoryStream sound1 = Properties.Resources.sound_1; //embedded resource
NAudio.Wave.WaveFileReader wav = new NAudio.Wave.WaveFileReader(sound1);
我怎样才能让它通过WaveFileReader 播放?它只接受string 路径。
解决方案
这可行,但声音以慢动作播放,听起来像混响。
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();
这适用于声音结束时响亮的爆裂声。
将流转换为字节数组
https://stackoverflow.com/a/1080445/6806643
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();
【问题讨论】:
-
@PaulF 它似乎仍然需要一个字符串路径。
-
我不确定你的意思 - WaveFileReader 接受 Stream 作为构造函数 - 这可以是从字节数组创建的 MemoryStream。您通过提取嵌入资源来创建字节数组。
-
@PaulF 他们使用
String filename。当我将其更改为UnmanagedMemoryStream filename以提取嵌入式资源时,它仍然需要String用于a.GetManifestResourceStream(filename)。 -
@MattMcManis:像 PaulF 提供的第一个链接(Rotem 接受的答案)一样,将 sound1 传递给 GetManifestResourceStream 不起作用吗?