C# 使用Naudio将MP3文件转换为WAV文件时出现问题

C# 使用Naudio将MP3文件转换为WAV文件时出现问题,c#,mp3,wav,naudio,C#,Mp3,Wav,Naudio,诺迪奥图书馆: 我试图将MP3文件转换为WAV文件,但遇到了一个小错误。我知道出了什么问题,但我真的不知道如何着手解决它 下面是我正在运行的一段代码: private void button1_Click(object sender, EventArgs e) { using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) { using(WaveFileWriter writer = new WaveF

诺迪奥图书馆:

我试图将MP3文件转换为WAV文件,但遇到了一个小错误。我知道出了什么问题,但我真的不知道如何着手解决它

下面是我正在运行的一段代码:

private void button1_Click(object sender, EventArgs e) {
    using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) {
        using(WaveFileWriter writer = new WaveFileWriter(@"C:\test.wav", new WaveFormat())) {
            int counter = 0;
            while(reader.Read(test, counter, test.Length + counter) != 0) {
                writer.WriteData(test, counter, test.Length + counter);
                counter += 512;
            }
        }
    }
}
reader.Read()进入Mp3FileReader类,方法如下所示:

public override int Read(byte[] sampleBuffer, int offset, int numBytes)
{
    if (numBytes % waveFormat.BlockAlign != 0)
        //throw new ApplicationException("Must read complete blocks");
        numBytes -= (numBytes % waveFormat.BlockAlign);
    return mp3Stream.Read(sampleBuffer, offset, numBytes);
}
private void button1_Click(object sender, EventArgs e) {
    using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) {
        using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) {
            WaveFileWriter.CreateWaveFile(outputFileName, convertedStream);
        }
    }
}
mp3Stream是Stream类的一个对象

问题是:我遇到了一个例外。MSDN说这是因为偏移量和numBytes之和大于sampleBuffer的长度

文件:

这是因为我每次都增加计数器,但字节数组的大小保持不变

我一直想知道的是:我需要动态增加数组的大小,还是需要在开始时找到所需的大小并立即设置


而且,Mp3FileReader中的方法第一次返回365,而不是512。这是整个街区的大小。但我正在写完整的512。我基本上只是用read来检查我是否还没有在文件的末尾。我是否需要捕获返回值并对其进行处理,或者我在这里做得好?

您需要使用Read()的返回值来确定实际得到的字节数。不必是512,你已经知道了。请记住,您使用的是流,而不是数组。让它看起来像这样:

   using (var reader = new Mp3FileReader(@"path\to\MP3")) {
        using (var writer = new WaveFileWriter(@"C:\test.wav", new WaveFormat())) {
            var buf = new byte[4096];
            for (;;) {
                var cnt = reader.Read(buf, 0, buf.Length);
                if (cnt == 0) break;
                writer.WriteData(buf, 0, cnt);
            }
        }
    }

在您的示例中,实际上并没有执行从MP3到WAV的任何转换。您需要波形转换流。试着这样做:

public override int Read(byte[] sampleBuffer, int offset, int numBytes)
{
    if (numBytes % waveFormat.BlockAlign != 0)
        //throw new ApplicationException("Must read complete blocks");
        numBytes -= (numBytes % waveFormat.BlockAlign);
    return mp3Stream.Read(sampleBuffer, offset, numBytes);
}
private void button1_Click(object sender, EventArgs e) {
    using(Mp3FileReader reader = new Mp3FileReader(@"path\to\MP3")) {
        using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) {
            WaveFileWriter.CreateWaveFile(outputFileName, convertedStream);
        }
    }
}

好的,我现在正在这样做,结果是大量的静态噪音。不过,这是一个完全不同的问题;而不是字节buf=新字节[4096];这不适用于我正在尝试的Windows 8.1应用商店应用程序。你能发布更新的方法或引导我找到正确的链接吗?看起来不错,但它不会运行。我一直收到一个“acmnotcapable calling acmStreamOpen”异常。这可能是因为您的目标格式与MP3的自然转换格式不匹配。我将更新代码示例