繁体   English   中英

使用System.Media.SoundPlayer播放Windows系统声音

[英]Playing Windows System Sounds with System.Media.SoundPlayer

System.Media.SoundPlayer是否可能无法播放c:\\ Windows \\ Media中找到的Windows系统声音?

我有代码:

using (var soundPlayer = 
       new SoundPlayer(@"c:\Windows\Media\Landscape\Windows Notify.wav")) 
{ 
    soundPlayer.Play(); 
}

但是,当我运行此代码时,我得到了错误:

Sound API only supports playing PCM wave files.

我想念什么吗? 有没有办法从WPF应用程序播放这些文件? (无需将它们转换为PCM)

SystemSounds类包含以下预定义的系统声音:

星号哔叫感叹号问题

因此,例如,播放停止:

System.Media.SystemSounds.Hand.Play();

所有其他声音都需要您从注册表中读取所需的声音,并使用以下代码播放它:

SoundPlayer simpleSound = new SoundPlayer(@"c:\Windows\Media\Landscape\Windows Notify.wav");

“风景”是指Windows的“声音方案”,其中的wav文件由Windows OS使用。 您已经确定,这些文件不能直接使用。

Windows目录下的Windows Notify.wav文件和基本Windows \\ Media目录下的Windows Notify.wav文件大小的比较是相当大的。 222KB和25.5KB-

如果进入“声音”控制面板小程序并浏览到“声音”选项卡,您将看到“声音方案:”的下拉列表,并且Windows \\ Media中的其他文件夹将显示在该列表中。

我没有支持此操作的链接,但是经过无数小时地以编程方式处理“控制面板声音”的操作之后,我敢冒险猜测“声音方案” wav文件仅包含在运行时消耗的相关数据(也许是效果数据)播放这些声音的修改版本...对于最后一部分,我可能是完全错误的; 这只是一个猜测。 无论如何,您将无法直接在代码中使用这些声音方案文件。

如果您必须播放“通知”波形的“横向”版本,则建议您播放声音并将其保存到音频编辑器中的新wave文件中。 您可以将wave文件添加到安装程序/部署项目中,以将其播放到Windows \\ Media文件夹中,并以与您已经使用的相同的方式直接调用它。

这是一个有趣的问题,但是答案很简单。 在阅读了这个问题之后,我尝试了您的代码并遇到了同样的问题,因此我在网上搜索了解决方案。 虽然没有找到确切的解决方案,但我确实发现SoundPlayer没有播放任何捆绑的Windows声音 ,在StackOverflow上发布了PCM wav文件 ,其中显示了一些代码,这些代码成功地播放了Windows\\Media文件夹中的音频文件。

我尝试了代码,它起作用了,所以我只好弄清楚了为什么您的示例不起作用。 我检查了音频文件中确实起到和你在音频编辑通知音频文件之间的差异,但他们肯定WAV文件。

我尝试播放Windows\\Media\\Landscape文件夹中的其他音频文件,但遇到相同的错误。 然后,我尝试播放Windows\\Media文件夹中其他子文件夹中的音频文件,但仍然出现相同的错误。 但是,然后我注意到Windows\\Media文件夹中的许多文件夹都包含相同的音频文件。

这让我开始思考,最终我意识到这些文件夹中的所有音频文件实际上都直接在Windows\\Media文件夹中。 因此,您可以播放声音,但是只需要忽略子文件夹中的声音,然后从Windows\\Media文件夹中播放声音即可 这将起作用:

SoundPlayer soundPlayer = new SoundPlayer(@"C:\Windows\Media\Windows Notify.wav");
soundPlayer.Play();

但是,我不能告诉您为什么会出现这个奇怪的错误,但是我只能假设文件夹中的文件可能是Windows\\Media文件夹中实际文件的某种链接,并且仅由操作系统使用将它们分为几类...或类似的东西。

由于声音似乎是压缩格式,因此必须先解压缩声音,然后才能使用SoundPlayer播放。 您可以使用Windows音频压缩管理器解压缩声音以进行播放:

https://msdn.microsoft.com/zh-CN/library/windows/desktop/dd742945(v=vs.85).aspx

但是,实现起来相当复杂,因此我发现了一个不错的库NAudio:

http://naudio.codeplex.com/

与使用System.Media.SoundPlayer相比,使用NAudio似乎要复杂得多,但它似乎还提供更多的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM