我为某些短信添加了通知声音,作为我项目主文件的参考,并尝试按以下方式运行
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");
答案 0 :(得分:1)
根据documentation判断,您的资源流不好。
Play方法使用新线程播放声音。如果你打电话给Play 在.wav文件加载到内存之前,.wav文件将会 在播放开始前加载。您可以使用LoadAsync或Load 提前将.wav文件加载到内存的方法。在.wav文件之后 从Stream或URL成功加载,以后调用回放 SoundPlayer的方法不需要重新加载.wav文件 直到声音的路径改变。
如果.wav文件还没有 指定或无法加载,Play方法将播放默认值 发出哔哔声。
所以问题是GetManifestResourceStream()
没有做你认为它正在做的事情。
解决方案(基于ResourceManager)
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();
}
}
答案 1 :(得分:0)
似乎System.Media.SoundPlayer
类支持的WAV格式非常有限。
我已经尝试过使用字符串路径构造函数,它可以处理一些.wav文件,但是对其他文件失败了。
以下是一些示例代码。如果您使用的是Windows 7,则可以自行检查,只需创建一个默认的新Windows窗体应用程序并为其添加一个按钮。
注意代码如何用于“success”字符串,并为“fail”字符串抛出InvalidOperationException。
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
System.Media.SoundPlayer player;
public Form1()
{
InitializeComponent();
string success = @"C:\Windows\Media\Windows Battery Critical.wav";
string fail = @"C:\Windows\Media\Sonata\Windows 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文件编写代码,并告诉我们它是如何工作的。