我目前正在研究“图像到音频”转换器。我收集图像的RGB值并根据该值播放音符(每个颜色通道1个音符,每个通道使用不同的乐器)。我对C#一点都不熟悉,尽管我的代码质量可能真的很差,但我只是想使程序运行良好(因为我将进行口头陈述,在此我需要解释自己的所作所为。我需要做一些我几乎完全理解的事情。代码质量不是我练习的主要目的(目的是制作我们的第一个Windows窗体应用程序并在其上运行代码而不会出现错误)。
为此,我需要读取一些音频文件,但是在执行代码时出现此“ InvalidParameter call acmStreamClose”错误。该代码可以很好地编译,并且似乎可以正常工作(实际上,它可以读取我的音乐文件),但是在运行该程序时,我通常会收到此错误消息(它不会停止程序,并且音乐文件仍在播放)。
我已经搜索了有关此问题的信息,发现的所有内容都是this,但是我不确定这是否是遇到的相同问题。我不明白为什么它不起作用,因为根据选择转换的图像,错误不会同时发生(并且每次进入Timer循环时都不会发生)。
我必须连续读取许多文件(同时每个像素读取3个文件),因此我将以下代码放入Timer中:
//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:调用acmStreamClose的InvalidParameter
à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(Object sender,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)