Библиотека 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 говорит, что это связано с тем, что сумма смещения и numBytes больше, чем длина sampleBuffer.
Документация: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx
Это происходит потому, что я каждый раз увеличиваю счетчик, но размер массива байтов test
остается прежним.
Меня вот что интересует: нужно ли динамически увеличивать размер массива, или нужно узнать нужный размер в начале и сразу задать?
И еще, вместо 512 метод в Mp3FileReader в первый раз возвращает 365. Это размер целого блока. Но я пишу полный 512. Я в основном просто использую чтение, чтобы проверить, не достиг ли я еще конца файла. Мне нужно поймать возвращаемое значение и что-то с этим сделать, или я хорошо здесь?