MediaPlayer 默认不支持MP3解码,需依赖WMF且要求绝对路径、MediaOpened事件触发后播放;SoundPlayer仅支持WAV;推荐NAudio解码MP3或WPF中使用MediaElement(注意权限与资源释放)。

MediaPlayer 播放 MP3 会静音或报错 FileNotFoundException
Windows Forms 里直接 new MediaPlayer 并调用 Open(),大概率没声音,甚至抛出 FileNotFoundException —— 因为 MediaPlayer(来自 System.Windows.Media)默认不支持 MP3 解码,它依赖系统底层的 Windows Media Foundation(WMF),而 WMF 在 Win10/11 默认关闭 MP3 软解,且 .NET Framework 版本越低越容易挂。
实操建议:
- 确认项目目标框架是
.NET Framework 4.6.2+或.NET Core 3.1+ / .NET 5+(后者需额外引用Microsoft.Windows.SDK.Contracts,且仅限 UWP/WinUI 场景) - MP3 文件路径必须是绝对路径,
MediaPlayer.Open(new Uri("sound.mp3"))这种相对路径基本失败 - 调用
Play()前必须确保MediaOpened事件已触发,否则立即播放会静音;别在构造完就Play() - 若仍报
FileNotFoundException,大概率是缺 WMF 编解码器,换方案更省事
用 SoundPlayer 播放 MP3?不行,它只认 WAV
SoundPlayer 看起来最轻量,但它的设计目标就是 WAV 格式:只支持 PCM 编码、单声道/立体声、无压缩的 .wav。传 MP3 给它,运行时不会报错,但 Play() 后完全无声,Load() 也可能卡住或吞掉异常。
实操建议:
- 别对
SoundPlayer抱幻想,MP3 → WAV 转换必须提前做,不能靠它实时解码 - 如果只是播提示音,用 Audacity 或 ffmpeg 批量转成 16bit 44.1kHz 单声道 WAV,再喂给
SoundPlayer是最稳的 -
SoundPlayer.Stream接MemoryStream也只接受 WAV header,MP3 的 byte[] 直接塞进去等于白干
真正能用的方案:用 NAudio 解码 MP3 并推给 WASAPI
要原生支持 MP3、控制音量、暂停/继续、不卡 UI,NAudio 是目前 C# 里最靠谱的选择。它把 MP3 解码(用 MP3FileReader)、音频重采样、设备输出(WaveOutEvent 或 WasapiOut)全包了,而且 NuGet 安装即用。
实操建议:
- 安装包:
NuGet 包管理器中搜 <code>NAudio,选官方作者 Mark Heath 的那个 - 基础播放代码极简:
var reader = new MP3FileReader("alarm.mp3"); var output = new WaveOutEvent(); output.Init(reader); output.Play(); - 注意
WaveOutEvent是多线程安全的,Play()不阻塞 UI;但reader和output需手动Dispose(),否则资源泄漏 - 如果需要调节音量,别碰
output.Volume(它只影响 WaveOut,对 WASAPI 无效),改用VolumeProvider包一层reader
WPF 中想用 XAML 控件播 MP3?绕开 MediaPlayer,用 MediaElement
MediaElement 是 WPF 里真正能声明式播 MP3 的控件,但它底层还是走 WMF,所以兼容性陷阱和 MediaPlayer 一样多——尤其在未激活的窗口、后台线程、或打包成 ClickOnce 应用时,常静音或加载失败。
实操建议:
- XAML 里写:
<MediaElement x:Name="player" Source="pack://application:,,,/Sounds/alarm.mp3" LoadedBehavior="Manual" />
,必须设LoadedBehavior="Manual",否则自动播放逻辑不可控 - C# 中等
MediaOpened事件触发后再player.Play(),别在Loaded事件里就播 - 路径优先用
pack://applicationURI,避免文件权限或路径编码问题;MP3 文件属性设为Resource或Content(Copy to Output Directory = Copy if newer) - 如果部署到客户机后静音,检查系统是否禁用了“应用访问音频设备”权限(Win10/11 设置 → 隐私 → 麦克风/音频)
NAudio 的 MP3 解码链路清晰、可控性强,但要注意它不自动释放 COM 资源,Dispose() 忘了就会让后续播放卡死;MediaElement 表面简单,实际受系统策略绑架最深——这两个点,多数人调试到第三天才意识到。









