В настоящее время я работаю над конвертером «Изображение в аудио».Я собираю значения RGB изображения и играю ноту в зависимости от значения (1 музыкальная нота на цветовой канал и разные инструменты для каждого канала).Я совсем не знаком с C # и просто пытаюсь заставить программу работать хорошо, несмотря на то, что качество моего кода может быть очень низким (потому что у меня будет устная презентация, где мне нужно будет объяснить, что я сделал, такМне нужно делать то, что я понимаю почти идеально).Качество кода не является основной целью моего упражнения (цель состояла в том, чтобы сделать наше первое приложение Windows Form и иметь код, работающий на нем без ошибок).
Для этого мне нужно прочитать некоторыеаудио файлы, но я получаю эту ошибку "InvalidParameter вызывая acmStreamClose", когда я выполняю свой код.Код компилируется хорошо и, кажется, работает нормально (фактически, он читает мои музыкальные файлы), но я обычно получаю эту ошибку во время работы программы (она не останавливает программу, и музыкальные файлы продолжают воспроизводиться).
Я искал информацию об этой проблеме, и все, что я нашел, было это , но я не уверен, что это та же самая проблема, с которой столкнулись.Я не понимаю, почему это не работает, потому что ошибка не происходит в то же время в зависимости от изображения, которое я выбираю для преобразования (и это происходит не каждый раз, когда я вхожу в цикл таймера).
Iприходится читать много файлов подряд (3 файла на пиксель одновременно), поэтому я помещаю следующий код в таймер:
//Gamme_note are list that contains RGB values of each pixels
switch (gamme_note_r[i])[...] //Note selector for the red channel giving value to pcm_rouge
switch (gamme_note_v[i])[...] //Note selector for the green channel giving value to pcm_vert
switch (gamme_note_b[i])[...] //Note selector for the blue channel giving value to pcm_bleu
Vider_lecteur();
stream_r = new NAudio.Wave.BlockAlignReductionStream(pcm_rouge);
note_rouge = new NAudio.Wave.DirectSoundOut();
note_rouge.Init(stream_r);
note_rouge.Play();
stream_v = new NAudio.Wave.BlockAlignReductionStream(pcm_vert);
note_verte = new NAudio.Wave.DirectSoundOut();
note_verte.Init(stream_v);
note_verte.Play();
stream_b = new NAudio.Wave.BlockAlignReductionStream(pcm_bleu);
note_bleue = new NAudio.Wave.DirectSoundOut();
note_bleue.Init(stream_b);
note_bleue.Play();
(я не знаю, могла ли эта часть кодавызвать проблему)
Когда я выполняю пошаговую отладку, я вижу, что проблема связана с методом "Vider_lecteur", который:
private void Vider_lecteur()
{
if (note_rouge != null)
{
if (note_rouge.PlaybackState == NAudio.Wave.PlaybackState.Playing)
{
note_rouge.Stop();
}
note_rouge.Dispose();
note_rouge = null;
}
if (stream_r != null)
{
stream_r.Dispose();
stream_r = null;
}
if (note_verte != null)
{
if (note_verte.PlaybackState == NAudio.Wave.PlaybackState.Playing)
{
note_verte.Stop();
}
note_verte.Dispose();
note_verte = null;
}
if (stream_v != null)
{
stream_v.Dispose();
stream_v = null;
}
if (note_bleue != null)
{
if (note_bleue.PlaybackState == NAudio.Wave.PlaybackState.Playing)
{
note_bleue.Stop();
}
note_bleue.Dispose();
note_bleue = null;
}
if (stream_b != null)
{
stream_b.Dispose();
stream_b = null;
}
}
Я основал свою работу на этом video .
Проблема всегда возникает из-за метода stream_something.Dispose ().
Я получаю текст ошибки:
************** Texte de l'exception **************
NAudio.MmException: InvalidParameter, вызывающий acmStreamClose
à NAudio.Wave.Compression.AcmStream.Dispose (логическое удаление)
à NAudio.Wave.AcmMp3FrameDecompressor.Dispose ()
à NAudio.Wave.Mp3FileReader.Dispose (логическое удаление)
à System.IO.Stream.Close ()
à System.IO.Stream.Dispose ()
à NAudio.Wave.BlockAlignReductionStream.Dispose (логическое удаление)
à System.IO.Stream.Close ()
à System.IO.Stream.Dispose ()
à Image2audio.Form1.Vider_lecteur () dans
C: \ Users \ fabie \ Desktop \ Image2audio \ Image2audio \ Form1.cs: ligne 468
à Image2audio.Form1.timer1_Tick (отправитель объекта, EventArgs e)dans
C: \ Users \ fabie \ Desktop \ Image2audio \ Image2audio \ Form1.cs: ligne 388
à System.Windows.Forms.Timer.OnTick (EventArgs e)
System.Windows.Forms.Timer.TimerNativeWindow.WndProc (Message & m)
System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg,> IntPtr wparam, IntPtr lparam)