我已经为一些文本消息添加了通知声音作为我项目主文件的参考,并尝试使其按如下方式工作
System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream s = a.GetManifestResourceStream("SignInSound.wav");
System.Media.SoundPlayer player = new System.Media.SoundPlayer(s);
player.Play();
我播放了声音,但它不是我添加的绝对声音。而是播放标准窗口声音。有什么想法吗?
更新
问题在于从资源中获取文件
System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream s = a.GetManifestResourceStream("SignInSound.wav");
从文档来看,您的资源流很糟糕。
Play 方法使用新线程播放声音。如果您调用"播放" 在将.wav文件加载到内存之前,.wav文件将 在播放开始之前加载。您可以使用 LoadAsync 或 Load 提前将.wav文件加载到内存的方法。.wav文件之后 已成功从流或 URL 加载,将来调用播放 SoundPlayer 的方法不需要重新加载.wav文件 直到声音的路径发生变化。
如果.wav文件尚未 指定或加载失败,Play 方法将播放默认值 哔哔声。
所以问题是GetManifestResourceStream()
没有做你认为它正在做的事情。
解决方案(基于资源管理器)
var thisType = this.GetType();
var assembly = thisType.Assembly;
var resourcePath = string.Format("{0}.{1}", assembly.GetName().Name, thisType.Name);
var resourceManager = new ResourceManager(resourcePath, assembly);
var resourceName = "SignInSound";
using ( Stream resourceStream = resourceManager.GetStream(resourceName) )
{
using ( SoundPlayer player = new SoundPlayer(resourceStream) )
{
player.PlaySync();
}
}
似乎System.Media.SoundPlayer
类支持的 WAV 格式数量非常有限。我尝试使用字符串路径构造函数,它适用于某些.wav文件,而不适用于其他文件。
下面是一些示例代码。如果您使用的是Windows 7,则可以自己检查它,只需创建一个默认的新Windows窗体应用程序并向其添加一个按钮即可。
请注意代码如何用于"成功"字符串,并为"失败"字符串引发 InvalidOperationException。
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
System.Media.SoundPlayer player;
public Form1()
{
InitializeComponent();
string success = @"C:WindowsMediaWindows Battery Critical.wav";
string fail = @"C:WindowsMediaSonataWindows Battery Critical.wav";
player = new System.Media.SoundPlayer(success);
}
private void button1_Click(object sender, EventArgs e)
{
player.Play();
}
}
}
请注意,"success"下的文件的比特率为 1411 kbps,而另一个文件的比特率为 160 kbps。使用比特率为 1411 kbps 的 WAV 文件尝试您的代码,并告诉我们它是如何工作的。