0

我添加了一些短信的通知声音作为我项目主文件的参考,并尝试使其工作如下

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();

我播放了声音,但它不是我添加的绝对声音。而是播放标准的 Windows 声音。有任何想法吗?

更新

问题在于从资源中获取文件

System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream s = a.GetManifestResourceStream("SignInSound.wav");
4

2 回答 2

2

文档来看,您的资源流很糟糕。

Play 方法使用新线程播放声音。如果您在 .wav 文件加载到内存之前调用 Play,则 .wav 文件将在播放开始之前加载。您可以使用 LoadAsync 或 Load 方法将 .wav 文件提前加载到内存中。从 Stream 或 URL 成功加载 .wav 文件后,以后调用 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();
    }
}
于 2014-02-11T07:38:50.233 回答
0

似乎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:\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();
        }
    }
}

请注意,“成功”下的文件的比特率为 1411 kbps,而另一个文件的比特率为 160 kbps。使用比特率为 1411 kbps 的 WAV 文件尝试您的代码,并告诉我们它是如何工作的。

于 2014-02-11T08:20:11.713 回答