使用NAudio播放byte[]变量中的MP3(WPF开发场景)
直接播放内存中的MP3字节数组(WPF环境)
无需将数据库读取到的MP3字节数组写入磁盘,直接通过MemoryStream包装后即可传递给NAudio的播放组件,修改后的代码如下:
byte[] array = Word_Sounds_DB.Records[0].Sound1; // 用MemoryStream直接包装字节数组,替代文件读写操作 using (var ms = new MemoryStream(array)) using (var rdr = new Mp3FileReader(ms)) using (var wavStream = WaveFormatConversionStream.CreatePcmStream(rdr)) using (var baStream = new BlockAlignReductionStream(wavStream)) using (var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) { waveOut.Init(baStream); waveOut.Play(); // 等待播放完成(如果是UI线程执行此代码,会阻塞界面,可考虑改用异步方式) while (waveOut.PlaybackState == PlaybackState.Playing) { Thread.Sleep(100); } }
关键改动说明:
- 移除了所有文件相关操作(
FileStream创建、写入、读取文件),直接用MemoryStream包装原始的byte[] MemoryStream会在using块结束时自动释放资源,无需手动关闭
额外提示:
如果这段代码在WPF的UI线程中执行,Thread.Sleep会导致界面卡顿。可以改用监听PlaybackStopped事件的异步方式:
byte[] array = Word_Sounds_DB.Records[0].Sound1; var ms = new MemoryStream(array); var rdr = new Mp3FileReader(ms); var wavStream = WaveFormatConversionStream.CreatePcmStream(rdr); var baStream = new BlockAlignReductionStream(wavStream); var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()); waveOut.Init(baStream); waveOut.PlaybackStopped += (s, e) => { // 播放完成后释放资源 waveOut.Dispose(); baStream.Dispose(); wavStream.Dispose(); rdr.Dispose(); ms.Dispose(); }; waveOut.Play();
内容的提问来源于stack exchange,提问作者Francisco Lopez
相关产品推荐
相关产品推荐

