如何将NAudio WaveStream写入内存流?

7

我有一个程序,它接收字节数组中的mp3数据。它必须将该mp3数据转换为wav格式并将其存储在字节数组中。我尝试使用NAudio来完成这个任务。我正在使用以下代码:

Stream inputStream = ...;
Stream outputStream = ...;

using (WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(inputStream)))
using (WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, waveStream.WaveFormat))
{
    byte[] bytes = new byte[waveStream.Length];
    waveStream.Read(bytes, 0, waveStream.Length);
    waveFileWriter.WriteData(bytes, 0, bytes.Length);
    waveFileWriter.Flush();
}

当我运行上述代码时,字节数组中只收到了0。但如果使用 WaveFileWriter 将数据直接写入文件,则文件会收到正确的数据。有什么原因吗?


你尝试过在读取之前将位置设置为0吗?只是一个想法。 - Chris Gessler
@ChrisGessler WaveFileWriter 不允许寻址。 - gibraltar
不涉及WaveFileWriter,WaveStream应该能够进行寻址。 - Chris Gessler
2个回答

7

试一试这个:

using (WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(inputStream))) 
using (WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, waveStream.WaveFormat)) 
{ 
    byte[] bytes = new byte[waveStream.Length]; 
    waveStream.Position = 0;
    waveStream.Read(bytes, 0, waveStream.Length); 
    waveFileWriter.WriteData(bytes, 0, bytes.Length); 
    waveFileWriter.Flush(); 
} 

4
如果您正在写入 MemoryStream,请注意,在您处理 WaveFileWriter 后,该 MemoryStream 将被释放。这里有一个可以使用 IgnoreDisposeStream 的解决方法。(同时请注意,WaveFormatConversionStream.CreatePcmStream 是不必要的 - Mp3FileReader 已经从 Read 中返回了 PCM)。我建议读取小块而不是尝试通过整个文件。
var path = @"mytestFile.mp3";
var mp3ByteArray = File.ReadAllBytes(path);

var outputStream = new MemoryStream();
using (var mp3Stream = new MemoryStream(mp3ByteArray))
using (var reader = new Mp3FileReader(mp3Stream))
using (var waveFileWriter = new WaveFileWriter(new IgnoreDisposeStream(outputStream), 
                                               reader.WaveFormat))
{
    byte[] buffer = new byte[reader.WaveFormat.AverageBytesPerSecond];
    int read;
    while((read = reader.Read(buffer,0, buffer.Length)) > 0)
    {
        waveFileWriter.Write(buffer, 0, read);
    }
}

// outputStream has not yet been disposed so we can get the byte array from it
var wavBytes = outputStream.GetBuffer();

// or we could play it like this
outputStream.Position = 0;
using (var player = new WaveOutEvent())
using (var reader = new WaveFileReader(outputStream))
{
    player.Init(reader);
    player.Play();
    while(player.PlaybackState != PlaybackState.Stopped)
    {
        Thread.Sleep(1000);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接