如何直接读取NAudio转换后的流,无需先写入文件再二次读取?
可以直接在内存中完成转换,无需将文件写入磁盘,核心是将WaveFileWriter的输出目标从本地文件路径替换为内存流MemoryStream,实现代码如下:
using (MediaFoundationReader reader = new MediaFoundationReader(audioUrl)) using (ResamplerDmoStream resampledReader = new ResamplerDmoStream(reader, new WaveFormat(reader.WaveFormat.SampleRate, reader.WaveFormat.BitsPerSample, 2))) { // 初始化内存流作为WAV数据的输出载体 using (var wavMemoryStream = new MemoryStream()) { // leaveOpen设为true,避免WaveFileWriter释放时自动关闭内存流 using (var waveWriter = new WaveFileWriter(wavMemoryStream, resampledReader.WaveFormat, leaveOpen: true)) { resampledReader.CopyTo(waveWriter); waveWriter.Flush(); } // 将内存流指针重置到起始位置,后续可直接读取 wavMemoryStream.Position = 0; // 此处可直接操作内存流,示例:转为字节数组 byte[] wavBytes = wavMemoryStream.ToArray(); // 你的后续业务逻辑 } }
注意事项
- 如果你的NAudio版本较低,没有带
leaveOpen参数的WaveFileWriter构造函数,可以去掉waveWriter的using包裹,写完数据后手动调用Dispose()方法再操作内存流即可 - 如果你只需要原始PCM采样数据、不需要WAV文件头,可以直接读取
resampledReader流的内容,不需要走WaveFileWriter封装 - 内存流使用完后会自动释放,不会产生磁盘IO和临时文件残留
内容的提问来源于stack exchange,提问作者Mahmoud Hefny
相关产品推荐
相关产品推荐

