You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SoundPlayer播放背景音乐时出现Windows错误音效的问题

问题排查与解决

核心原因

播放Windows错误音效的本质是SoundPlayer拿到了无效的null流,说明代码未正确找到嵌入的音频资源,再加上播放调用逻辑冲突,双重触发异常。

具体问题分析

  1. 资源路径错误
    GetManifestResourceStream的参数必须是嵌入资源的完整限定名,格式为[程序集根命名空间].[资源文件名]。你写的SuperJenya.horror_music.wav可能不符合实际:

    • 项目根命名空间并非SuperJenya
    • 文件名大小写不匹配(嵌入资源名区分大小写)
    • 音频文件未设置为「嵌入的资源」属性
  2. 播放调用逻辑冲突
    同时调用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ī

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:47:15