使用SoundPlayer播放背景音乐时出现Windows错误音效的问题
问题排查与解决
核心原因
播放Windows错误音效的本质是SoundPlayer拿到了无效的null流,说明代码未正确找到嵌入的音频资源,再加上播放调用逻辑冲突,双重触发异常。
具体问题分析
资源路径错误
GetManifestResourceStream的参数必须是嵌入资源的完整限定名,格式为[程序集根命名空间].[资源文件名]。你写的SuperJenya.horror_music.wav可能不符合实际:- 项目根命名空间并非
SuperJenya - 文件名大小写不匹配(嵌入资源名区分大小写)
- 音频文件未设置为「嵌入的资源」属性
- 项目根命名空间并非
播放调用逻辑冲突
同时调用PlayLooping()(异步循环播放)和PlaySync()(同步阻塞播放)会互相干扰:PlayLooping启动后,PlaySync会尝试重新播放无效流,进一步触发错误音效。
解决步骤
步骤1:修正嵌入资源配置
- 右键项目中的
horror_music.wav文件 → 属性 - 将生成操作改为「嵌入的资源」
- 点击项目属性 → 确认根命名空间(比如根命名空间是
MyGame,资源完整名就是MyGame.horror_music.wav)
步骤2:确认正确的资源路径
可以先枚举所有嵌入资源,找到目标文件的准确名称:
var assembly = System.Reflection.Assembly.GetExecutingAssembly(); var resourceNames = assembly.GetManifestResourceNames(); foreach (var name in resourceNames) { Console.WriteLine(name); // 运行后查看控制台输出的正确资源名 }
将输出的正确名称替换到GetManifestResourceStream的参数中。
步骤3:修正播放逻辑
只保留PlayLooping()即可,无需PlaySync(),同时增加流有效性判断:
var assembly = System.Reflection.Assembly.GetExecutingAssembly(); var resStream = assembly.GetManifestResourceStream("替换为正确的资源完整名"); if (resStream != null) { var player = new SoundPlayer(resStream); player.PlayLooping(); } else { Console.WriteLine("未找到目标音频资源"); }
额外注意事项
SoundPlayer仅支持PCM编码的WAV格式,压缩格式的WAV会导致播放失败PlayLooping()是异步播放,不会阻塞主线程,适合背景音乐场景;PlaySync()会卡住当前线程,不推荐使用
内容的提问来源于stack exchange,提问作者Biron al-Quppī
相关产品推荐
相关产品推荐

