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中的方法不是512,而是第一次返回365。这是整个街区的大小。但我正在编写完整的512.我基本上只是使用读取来检查我是否还没有在文件的末尾。我是否需要抓住回报值并做一些事情,或者我在这里做得好吗?
答案 0 :(得分: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);
}
}
}
答案 1 :(得分: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);
}
}
}