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

时间:2014-03-02 04:32:55

标签: c# wpf audio

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)

4 个答案:

答案 0 :(得分:2)

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

星号 嘟 感叹 手 问题

例如,播放停止:

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

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

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

答案 1 :(得分:2)

“Landscape”是指Windows“Sound Scheme”,其中的wav文件由Windows OS使用。如您所知,这些文件无法直接使用。

Landscape目录中的Windows Notify.wav和基本Windows \ Media目录中的Windows Notify.wav文件的文件大小的比较相当大; 222KB vs 25.5KB ---

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

我没有链接来支持这个,但是在以编程方式处理控制面板声音无数个小时后,我冒昧地猜测'声音方案'的wav文件只包含相关数据(可能是效果数据)在运行时消耗,以播放这些声音的修改版本...我可能在最后一部分错了;这只是猜测。无论如何,您将无法在代码中直接使用这些声音方案文件。

如果您必须播放Notify wav的“Landscape”版本,那么我建议播放声音并将其保存到音频编辑器中的新wave文件中。您可以将wave文件添加到安装程序/部署项目中,以将其播放到Windows \ Media文件夹中,并以与您原来相同的方式直接调用它。

答案 2 :(得分:1)

这是一个有趣的问题,但答案很简单。在阅读了这个问题之后,我尝试了你的代码并遇到了同样的问题,于是我在网上搜索了一个解决方案。虽然没有找到确切的解决方案,但我确实在StackOverflow上找到了SoundPlayer not playing any bundled windows sounds PCM wav files帖子,其中显示了一些代码成功播放了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文件夹中实际文件的链接由操作系统用于将它们分组到类别......或类似的东西。

答案 3 :(得分:1)

由于声音似乎是压缩格式,因此必须先将其解压缩才能使用SoundPlayer播放。您可以使用Windows Audio Compression Manager解压缩声音以进行播放:

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

然而,这实现起来相当复杂,所以我发现了一个很好的库,可以为你完成所有这些,NAudio:

http://naudio.codeplex.com/

使用NAudio似乎比使用System.Media.SoundPlayer稍微复杂一些,但它似乎也提供了更多的功能。