.NET Core下替代SoundPlayer的GenericEventArgs<Stream>音频播放方案咨询
替代System.Media.SoundPlayer的.NET Core音频播放方案
我之前做.NET Core迁移时也碰到过一模一样的问题,原来的System.Media.SoundPlayer在.NET Core里确实被移除了,不过不用慌,NAudio其实完全能搞定你的需求,大概率是之前的用法没踩对关键点。下面结合你的场景(从GenericEventArgs<Stream>播放TTS音频)给你详细的适配方案:
首选方案:NAudio(跨平台、灵活)
NAudio是.NET生态里最成熟的音频处理库,完美支持.NET Core/5+,而且能处理各种音频流格式。
第一步:安装NAudio包
用NuGet包管理器或者.NET CLI安装:
dotnet add package NAudio
第二步:适配原有播放逻辑
假设你原来的SoundPlayer调用大概是这样的:
// 原有SoundPlayer代码示例 using System.Media; private void PlayReceivedAudio(Stream audioStream) { using var player = new SoundPlayer(audioStream); player.Play(); }
现在替换成NAudio的实现,专门处理GenericEventArgs<Stream>的场景:
using NAudio.Wave; // 类级别维护WaveOut实例,避免重复创建 private WaveOutEvent _audioPlayer; private void OnAudioReceived(object sender, GenericEventArgs<Stream> e) { // 先停止并清理之前的播放任务 _audioPlayer?.Stop(); _audioPlayer?.Dispose(); try { // 把传入的流包装为WaveStream(默认假设是WAV格式,大部分TTS API都支持返回WAV) using var waveStream = new WaveFileReader(e.Value); _audioPlayer = new WaveOutEvent(); _audioPlayer.Init(waveStream); _audioPlayer.Play(); // 播放完成后自动清理资源 _audioPlayer.PlaybackStopped += (s, args) => { _audioPlayer.Dispose(); _audioPlayer = null; e.Value.Dispose(); // 释放音频流 }; } catch (Exception ex) { Console.WriteLine($"音频播放失败: {ex.Message}"); e.Value.Dispose(); // 异常时也要释放流 } }
特殊情况:如果TTS返回的是PCM裸流
如果你的TTS API返回的不是标准WAV,而是PCM裸数据,需要手动指定音频格式:
// 示例:16位、单声道、44100Hz的PCM格式 var targetFormat = new WaveFormat(44100, 16, 1); using var waveStream = new RawSourceWaveStream(e.Value, targetFormat); // 后续的Init、Play逻辑和上面一致
注意事项
- 确保TTS API返回的音频格式是NAudio支持的(WAV是最稳妥的选择,建议在API配置里指定)
WaveOutEvent是无窗口依赖的播放类,适合控制台、WinForms、WPF等各种.NET Core应用- 一定要妥善处理资源释放,避免内存泄漏(比如播放完成后Dispose播放器和流)
内容的提问来源于stack exchange,提问作者user9464656
相关产品推荐
相关产品推荐

