如何用NAudio在.NET Core(IoT Core)中从Stream播放音频?
用NAudio替代System.Media在.NET Core IoT Core中从Stream播放音频
我来帮你搞定这个迁移问题!既然.NET Core IoT Core没有内置System.Media,用NAudio确实是个靠谱的替代方案,它对WAV音频的处理和SoundPlayer类似,但灵活性更高。下面是具体的改造步骤和代码示例:
第一步:安装NAudio NuGet包
首先得把NAudio引入你的项目,用NuGet包管理器或者CLI命令都可以:
# .NET CLI命令 dotnet add package NAudio
或者在Visual Studio里通过NuGet包搜索直接安装NAudio。
第二步:改造你的PlayAudio方法
原来的SoundPlayer是封装好的简易播放类,NAudio需要我们手动处理音频流和播放组件。这里推荐用WaveOutEvent(适合非UI线程场景,IoT Core环境下适配性更好),配合WaveFileReader来读取WAV格式的流。
假设你的args.EventData是标准WAV格式的Stream,改造后的代码如下:
using NAudio.Wave; public void PlayAudio(object sender, GenericEventArgs<Stream> args) { // 重置流的位置到起始处(如果流之前被读取过,这一步很重要) args.EventData.Position = 0; // 使用WaveFileReader解析WAV流的头信息和音频数据 using var waveReader = new WaveFileReader(args.EventData); // 初始化播放设备,WaveOutEvent适合无UI的IoT环境 using var waveOut = new WaveOutEvent(); // 关联音频流和播放设备 waveOut.Init(waveReader); // 开始播放 waveOut.Play(); // 同步等待播放完成(如果不需要阻塞线程,可以用异步事件监听) while (waveOut.PlaybackState == PlaybackState.Playing) { System.Threading.Thread.Sleep(100); } }
关键注意事项
- 流格式要求:
WaveFileReader只支持带标准WAV头的音频流,如果你的流是原始PCM数据(无WAV头),需要改用RawSourceWaveStream,并手动指定采样率、位深度、声道数等参数。 - 资源释放:一定要用
using语句包裹WaveFileReader和WaveOutEvent,确保播放完成后及时释放音频资源,避免内存泄漏。 - IoT设备音频选择:如果你的IoT设备有多个音频输出设备,可以通过
WaveOut.DeviceCount获取设备列表,初始化WaveOutEvent时指定DeviceNumber参数来切换设备。 - 异步播放优化:如果不想阻塞当前线程,可以监听
PlaybackStopped事件来处理播放完成后的逻辑,示例如下:
public void PlayAudioAsync(object sender, GenericEventArgs<Stream> args) { args.EventData.Position = 0; var waveReader = new WaveFileReader(args.EventData); var waveOut = new WaveOutEvent(); // 播放完成后自动释放资源 waveOut.PlaybackStopped += (s, e) => { waveReader.Dispose(); waveOut.Dispose(); // 这里可以添加播放完成后的业务逻辑 }; waveOut.Init(waveReader); waveOut.Play(); }
这样改造后,就能在.NET Core IoT Core环境下顺利从Stream播放音频啦!
内容的提问来源于stack exchange,提问作者user9464656
相关产品推荐
相关产品推荐

