跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

C#怎么播放WAV音频文件_C#如何使用SoundPlayer类【干货】

SoundPlayer.Play() 无声音主因是同步加载失败且静默处理:路径错误、权限不足、文件占用、非PCM编码WAV、采样率过高、未用绝对/相对路径、嵌入资源未正确获取流、控制台中未等待或未设Build Action为Embedded Resource。 SoundPlayer.Play() 为什么没声音? 多数情况不是代码写错了,而是
SoundPlayer
默认用同步方式加载并播放,如果 WAV 文件路径不对、权限受限,或文件被其他进程占用,它会静默失败——不报错,也不发声。
SoundPlayer
只支持 PCM 编码的 WAV(
RIFF/WAVE fmt /data
结构),不支持压缩格式(如 ADPCM)、带元数据的 WAV 或采样率过高(如 192kHz)的文件 路径必须是绝对路径或当前工作目录下的相对路径;用
Properties.Resources
嵌入资源时,得先用
Stream
构造,不能直接传资源名字符串 调用
Play()
后立即退出程序(比如在控制台 Main 中),音频会被中断——因为
Play()
是异步但依赖主线程消息泵,WinForms 可用,控制台需加
Console.ReadKey()
等待 用 SoundPlayer 播放嵌入资源里的 WAV 资源文件得设为“嵌入的资源”(Build Action = Embedded Resource),否则
Properties.Resources.xxx
返回 null 或空字节流。 别直接传
Properties.Resources.MySound
给
SoundPlayer
构造函数——那是 byte[],而构造函数只接受
string
(路径)或
Stream
正确做法:用
Assembly.GetExecutingAssembly().GetManifestResourceStream("DefaultNamespace.Properties.Resources.MySound.wav")
获取流,再传给
new SoundPlayer(stream)
注意命名空间要完全匹配,WAV 文件在资源中显示的名称(右键资源 → “属性”看“资源逻辑名称”)就是实际路径,常含项目默认命名空间前缀 SoundPlayer 和 PlaySync() / PlayLooping() 的行为差异
Play()
启动后立刻返回,适合 UI 响应;
PlaySync()
会阻塞当前线程直到播完,控制台里用它不用额外等待;
PlayLooping()
会循环,但一旦调用
Stop()
才能终止——没有“暂停”功能。 C知道 CSDN推出的一款AI技术问答工具 下载 多次快速调用
Play()
可能导致重叠播放(Windows 系统级混音允许),但
PlaySync()
串行执行,不会叠加
PlayLooping()
在窗体关闭时若没手动
Stop()
,可能引发
ObjectDisposedException
,尤其在 FormClosing 事件里忘了清理 所有播放方法都不支持音量控制、左右声道调节或播放进度查询——这是
SoundPlayer
的硬限制,不是你用错了 替代方案:什么时候该换 NAudio 而不是硬扛 SoundPlayer 需要精准控制(比如播放指定时间段、实时音效处理、MP3/FLAC 支持、后台服务中稳定播放),
SoundPlayer
就不该再用了。它本质是 Windows API
PlaySound()
的薄封装,定位就是“简单提示音”。 控制台程序长期运行 + 播放多个音效?
SoundPlayer
容易内存泄漏(尤其反复 new 不 Dispose),NAudio 的
WaveOutEvent
更可控 要从网络流播放 WAV?
SoundPlayer
不支持非 seekable 流,NAudio 可以接
NetworkStream
或
HttpClient.GetStreamAsync()
WinForms/WPF 中需要拖动进度条或显示波形?
SoundPlayer
没有事件通知播放位置,必须换方案 真正卡住人的,往往不是“怎么播”,而是“为什么播了却听不见”——查路径、查编码、查线程生命周期,比翻文档还花时间。

相关文章