Случайное исключение System.IndexOutOfRangeException с использованием Naudio WaveFileWriter

Я борюсь с приведенным ниже исключением, используя WaveFileWriter. Это исключение возникает периодически - в большинстве случаев это работает нормально. Фрагмент кода ниже:

MemoryStream s = new MemoryStream();
MemoryStream newStream = new MemoryStream();

int length = 0;
byte[] buffer = null;
int read = 0;   

MixingSampleProvider mixer2 = new MixingSampleProvider(_samples);
SampleToWaveProvider16 mixer3 = new SampleToWaveProvider16(mixer2);

length = mixer3.WaveFormat.AverageBytesPerSecond*Convert.ToInt32(position.TotalSeconds); //position is a Timespan calculated to be the total duration of the WAV files
buffer = new byte[length]; 

WaveFileWriter waveFileWriter = new WaveFileWriter(new IgnoreDisposeStream(s), mixer3.WaveFormat);

while ((read = mixer3.Read(buffer, 0, buffer.Length)) > 0)
{
    waveFileWriter.Write(buffer, 0, read);
}

waveFileWriter.Flush();
waveFileWriter.Close();
waveFileWriter.Dispose();   

s.WriteTo(newStream);

Вот подробности об исключении:

System.IndexOutOfRangeException was caught
  HResult=-2146233080
  Message=Index was outside the bounds of the array.
  Source=NAudio
  StackTrace:
       at NAudio.Wave.SampleProviders.Pcm16BitToSampleProvider.Read(Single[] buffer, Int32 offset, Int32 count)
       at NAudio.Wave.SampleProviders.OffsetSampleProvider.Read(Single[] buffer, Int32 offset, Int32 count)
       at NAudio.Wave.SampleProviders.MixingSampleProvider.Read(Single[] buffer, Int32 offset, Int32 count)
       at NAudio.Wave.SampleProviders.OffsetSampleProvider.Read(Single[] buffer, Int32 offset, Int32 count)
       at NAudio.Wave.SampleProviders.MixingSampleProvider.Read(Single[] buffer, Int32 offset, Int32 count)
       at NAudio.Wave.SampleProviders.SampleToWaveProvider16.Read(Byte[] destBuffer, Int32 offset, Int32 numBytes)
       at GamedayRadio.HalfInning.Process() in xxxxxx
  InnerException: 

person David Soderna    schedule 26.05.2015    source источник


Ответы (1)


Не уверен, что это вызывает вашу ошибку, но убедитесь, что длина чтения точно кратна BlockAlign для вашего WaveFormat. Так, например, при чтении 16-битного стереозвука всегда считывайте кратные 4 байта (2 канала x 2 байта на образец). Ваш буфер выглядит так, как будто в некоторых обстоятельствах это может быть нечетное количество байтов.

person Mark Heath    schedule 01.06.2015
comment
Спасибо, в настоящее время я использую это для расчета длины, но все еще иногда получаю сообщение об ошибке: length = mixer3.WaveFormat.AverageBytesPerSecond * mixer3.WaveFormat.BlockAlign Любые дальнейшие идеи очень ценятся! - person David Soderna; 01.06.2015
comment
Обновление: ошибка возникает при выполнении чтения, а не записи (как видно из StackTrace), и я определил, что причиной проблемы являются определенные аудиосэмплы. Это тот же WaveFormat, что и другие, но чтение «плохих» файлов дает исключение. - person David Soderna; 05.06.2015