SoundPlayer 不播放任何捆绑的 Windows 声音 PCM wav 文件

Posted

技术标签:

【中文标题】SoundPlayer 不播放任何捆绑的 Windows 声音 PCM wav 文件【英文标题】:SoundPlayer not playing any bundled windows sounds PCM wav files 【发布时间】:2012-08-06 21:24:41 【问题描述】:

在 C# 中,我无法使用以下代码从 System.Media 获取 SoundPlayer 类来播放 C:\Windows\Media 文件夹中的任何 wav。我得到的只是没有声音:

String filename = "C:\\Windows\\Media\\tada.wav";
SoundPlayer sp = new SoundPlayer(filename);
sp.Load();
sp.Play();

我用一个名为“Gspot”的程序检查了波形文件“tada.wav”,它告诉我音频编解码器是“PCM Audio”。我没有收到任何编译器警告或错误,运行程序时也没有引发异常。我只是听不到任何声音。我的扬声器已打开,我可以使用 Windows Media Player 播放文件。

将 wav 添加为项目资源没有任何区别。有人可以帮我弄清楚为什么我听不到任何声音吗?

【问题讨论】:

【参考方案1】:

Play() 方法在单独的线程中播放声音。也就是说,控制台应用程序会旋转一个新线程来播放声音。这对于 Windows 应用程序非常有用,因此声音播放不会停止 Windows 主线程。在控制台应用程序中,当父线程结束时,子线程也会全部死亡。 -- 因此没有声音。

有一个 PlaySync() 方法不会产生新线程,因此会保持控制台应用程序线程处于活动状态,直到它完成播放您的声音。

【讨论】:

【参考方案2】:

您是否将其用作控制台应用程序中 main() 方法的主体?应用程序可能正在结束,从而关闭播放音频的线程。

我将您的代码复制并粘贴到新的“Visual C# 控制台应用程序”的主目录中。我添加了“使用 System.Text;”文件顶部的行,编译,单步执行,它起作用了。当我运行它(没有调试)时,我没有声音。

如果添加行:

System.Threading.Thread.Sleep(2000);

在调用 Play() 之后,应用程序将停留足够长的时间来播放音频。

【讨论】:

这就是答案,我添加了 Sleep 呼叫,问题就解决了。非常感谢您解决了这个问题。 正确的是控制台应用程序中的 main 主体。 太棒了!此外,您需要确保 sleep 的整数参数是音频文件的长度(以毫秒为单位)。 2000 是 2 秒,但您可能需要更改它以获得更长的音频文件。

以上是关于SoundPlayer 不播放任何捆绑的 Windows 声音 PCM wav 文件的主要内容,如果未能解决你的问题,请参考以下文章

SoundPlayer 并播放无缝连续的声音

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

在播放时从不同的线程停止 SoundPlayer

使用 System.Media.SoundPlayer.PlaySync() 和 AxWindowsMediaPlayer 并行播放声音

是否可以使用 SoundPlayer 背靠背播放 2 个声音?

使用 NAudio 转换为 WAV 后使用 SoundPlayer 播放 MP3