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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:57:17