【问题标题】:Trouble converting an MP3 file to a WAV file using Naudio使用 Naudio 将 MP3 文件转换为 WAV 文件时遇到问题
【发布时间】:2017-05-15 22:10:44
【问题描述】:

Naudio 库:http://naudio.codeplex.com/

我正在尝试将 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);
}

mp3Stream 是 Stream 类的一个对象。

问题是:我收到了 ArgumentException。 MSDN说这是因为offset和numBytes之和大于sampleBuffer的长度。

文档:http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

发生这种情况是因为我每次都增加计数器,但字节数组test 的大小保持不变。

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

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

【问题讨论】:

    标签: c# mp3 wav naudio


    【解决方案1】:

    您需要使用 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);
                }
            }
        }
    

    【讨论】:

    • 好的,我现在正在这样做,结果是很多静态噪音。不过,这是一个完全不同的问题。
    • 尝试改变 byte[] buf = new byte[4096];而不是 byte buf = new byte[4096];
    • 这不适用于我正在尝试的 Windows 8.1 Store 应用程序。您可以发布更新的方法或指导我找到正确的链接吗?
    【解决方案2】:

    在您的示例中,您实际上并未执行任何从 MP3 到 WAV 的转换。您需要 WaveFormatConversionStream。试试这样的:

    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);
            }
        }
    }
    

    【讨论】:

    • 看起来不错,但它不会运行。我不断收到“AcmNotPossible 调用 acmStreamOpen”异常。
    • 这可能是因为您的目标格式与 MP3 的自然转换格式不匹配。我会更新代码示例
    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多