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/zh-cn/library/system.io.stream.read.aspx

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

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

另外,Mp3FileReader中的方法不是512,而是第一次返回365。 整个块的大小。 但是我正在写完整的512。我基本上只是在使用read来检查我是否不在文件末尾。 我是否需要获取返回值并使用该值做点什么,还是我在这里好?

#1楼 票数:4 已采纳

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

#2楼 票数:1

在您的示例中,您实际上并没有执行从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);
        }
    }
}

  ask by KdgDev translate from so

未解决问题?本站智能推荐:

2回复

将大mp3文件转换为WAV计时问题

我正在处理一些大型mp3声音文件。 从几小时到15多小时不等。 我需要将这些mp3文件转换为wav。 由于文件大小,无法加载整个文件然后进行转换。 到目前为止,我的解决方案是使用NAudio和NAudio.Lame我已经修改了: Mp3FileReader和Mp3FrameDecom
1回复

Naudio:如何播放MP3和WAV文件?

好吧,我知道这对某些人来说听起来很容易,但我真的被困在这里了。 实际上,我正在使用Naudio构建一个音频播放器,我已经意识到在许多教程中,人们总是会展示出简单的方法来帮助您入门。 但是,在我看来,他们总是忘记展示在实际应用中实际完成的事情。 例如,在与Naudio一起播放音乐时,我会做类
1回复

如何使用naudio将mp3和wav文件加入字节缓冲区c#MVC中?

我找到了很多有关如何加入mp3或wav文件的文章,但是我没有找到有关如何加入不同类型的音频文件的任何内容。我想依次播放wav文件和mp3文件。 我试图通过使用将wav文件转换为mp3。 我通过以下代码从mp3文件中获取字节。 然后合并它们 但是它没有用。它只扮演第一部分
2回复

使用 naudio 将 Mp3 转换为 WAV,无需写入磁盘。 (仅限流媒体)

我想将 mp3 文件转换为 WAV。 在 DirectX.DirectSound 中,辅助缓冲区仅支持 WAV。 我正在使用 naudio 转换文件,这工作正常。 问题是我无法将文件保存在磁盘上,因此我必须将它们与流一起使用。 抛出异常的值不在预期范围内。 如何在不写入磁盘的情况下将音频转换
1回复

将WAV转换为MP3并返回到WAV

我正在为LAME使用NAudio包装器将wav文件转换为mp3。 但是,当我使用NAudio将mp3转换回wav时,wav文件比原始的wav文件大了一点。 有没有一种方法可以使原始和解码的WAV文件大小完全相同? 除此之外,其他所有东西都可以用,并且我可以播放wav和mp3文件而没有问题。
1回复

将超过2个频道的WAV文件转换为MP3时出现问题

我正在开发一个将流音频录制到MP3的C#应用​​程序。 我是新手,但到目前为止,最简单的方法是使用NAudio录制到WAV,然后使用LameMP3FileWriter或MediaFoundationEncoder创建MP3版本。 但是,由于我的PC声音系统为5.1,并且由于记录的WA
1回复

NAudio 是否支持在 Linux 中运行的 .Net Core api 中将 MP3 转换为 WAV?

我正在尝试找到一种方法,在 Linux 中运行的 .net core 3.1 api 中将 mp3 文件转换为 wav。 我可以使用 NAudio 库来做到这一点吗? 我知道他们支持 Windows,但不确定 Linux
4回复

NAudio分割mp3文件

我是音频或mp3的新手,正在寻找一种方法来在C#,asp.net中分割一个mp3文件。 谷歌搜索了3天没有太大的帮助,我希望有人能指出我正确的方向。 我可以用NAudio来完成这个吗? 有没有示例代码? 提前致谢。
3回复

如何使用 NAudio 播放 MP3 文件

这会引发异常: WaveBadFormat 调用 waveOutOpen 编码类型是“MpegLayer3”作为NAudio。 如何使用 NAudio 播放 mp3 文件?
2回复

NAudio流媒体到mp3文件通过yeti lame包装

我有以下代码来录制和录制音频 我正在使用NAudio来捕获音频输入/输出而且是'lame包装器将其转换为mp3文件即时,问题是所产生的音频输出文件已损坏且不可读,可能是,缺少mp3标题或其他我的东西错过了......