NAudio问题-管理一个接一个播放的多模块声音文件

NAudio问题-管理一个接一个播放的多模块声音文件,audio,naudio,Audio,Naudio,我一直在努力解决一个问题,这个问题已经困扰了我好几个星期了!基本上,我正在开发的软件可以录制音频,然后播放。该软件可以录制多个音频文件,然后一个接一个地播放(使其看起来像是一个连续的音频文件)。然而,我遇到的问题是,从第二个声音文件开始,第二个、第三个、第四个(等等)文件的顶部似乎有一个“滴答声” 这个滴答声是第一个声音文件的最后几毫秒。我所指的“滴答声”类似于乙烯基唱片跳得非常快的声音 到目前为止,我还没有找到问题的根源,有没有人知道是什么导致了这一问题 谢谢 编辑:在下面添加了一些方法 好的

我一直在努力解决一个问题,这个问题已经困扰了我好几个星期了!基本上,我正在开发的软件可以录制音频,然后播放。该软件可以录制多个音频文件,然后一个接一个地播放(使其看起来像是一个连续的音频文件)。然而,我遇到的问题是,从第二个声音文件开始,第二个、第三个、第四个(等等)文件的顶部似乎有一个“滴答声”

这个滴答声是第一个声音文件的最后几毫秒。我所指的“滴答声”类似于乙烯基唱片跳得非常快的声音

到目前为止,我还没有找到问题的根源,有没有人知道是什么导致了这一问题

谢谢

编辑:在下面添加了一些方法

好的,下面的方法是replay方法

public override void Replay(long time)
    {
        if(this.StartTime <= time && this.EndTime >= time && (Speed >= 0.95 && Speed <= 1.05))
        {
            if (!locked)
            {
                locked = true;
                //close the previous stream
                CloseWaveOut();
                //open the file
                waveOut = new NativeDirectSoundOut(latency);
                mainOutputStream = CreateInputStream(outputFilename);
                if (waveOut != null && mainOutputStream != null)
                {
                    //set the time position
                    long offset = time - StartTime;
                    if (offset > 0)
                    {
                        mainOutputStream.CurrentTime = TimeSpan.FromMilliseconds(Convert.ToDouble(offset));
                    }
                    //CurrentTime = TimeSpan.FromMilliseconds(Convert.ToDouble(time - StartTime));
                    waveOut.Init(mainOutputStream);
                    ((WaveChannel32)mainOutputStream).Volume = Volume;
                    Console.WriteLine("waveOut Playing");  // Debugging purposes
                    waveOut.Play();
                }
            }
        }
    }
公共覆盖无效重播(长时间)
{
如果(this.StartTime=时间和速度>=0.95和速度0)
{
mainOutputStream.CurrentTime=TimeSpan.FromMillions(Convert.ToDouble(offset));
}
//CurrentTime=TimeSpan.FromMillics(转换为双精度(time-StartTime));
waveOut.Init(主输出流);
((WaveChannel32)mainOutputStream)。音量=音量;
Console.WriteLine(“waveOut播放”);//调试目的
waveOut.Play();
}
}
}
}
以下方法为记录方法:

        public override void Record(long time)
    {
        if (waveInStream == null && writer == null && !recorded)
        {
            //for record 
            writer = new WaveFileWriter(outputFilename, recordingFormat);
            waveInStream = new WaveInStream(deviceNumber, recordingFormat, null);
            waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);

            waveInStream.StartRecording();
            this.StartTime = time;

            Console.Out.WriteLine("Record Method called"); // Debugging Purposes
        }
    }
公共覆盖无效记录(长时间)
{
如果(waveInStream==null&&writer==null&&recorded)
{
//记录在案
writer=新的WaveFileWriter(outputFilename,recordingFormat);
waveInStream=新的waveInStream(deviceNumber,recordingFormat,null);
waveInStream.DataAvailable+=新事件处理程序(waveInStream_DataAvailable);
waveInStream.StartRecording();
this.StartTime=时间;
Console.Out.WriteLine(“调用的记录方法”);//调试目的
}
}

我建议不要关闭和打开WaveOut,而是始终打开一个WaveOut实例。创建一个新的IWaveProvider,其读取方法首先返回第一个WAV文件中的所有数据,然后返回第二个WAV文件中的所有数据


要找到滴答声的来源,我首先在Windows Media Player中仔细检查录制的WAV文件本身是否没有滴答声。

我建议不要关闭和打开WaveOut,而是始终打开一个WaveOut实例。创建一个新的IWaveProvider,其读取方法首先返回来自首先是WAV文件,然后是第二个文件中的所有数据


要找到滴答声的来源,我首先在Windows Media Player中仔细检查录制的WAV文件本身是否没有滴答声。

您需要显示一些源代码才能获得帮助。您如何录制和播放音频?添加了一些代码插入播放方法和录制方法yo你需要显示一些源代码才能获得帮助。你是如何录制和播放音频的?添加了一些代码插入播放方法和录制方法自发布以来,我确实尝试过不关闭WaveOut对象-似乎没有任何区别。我还检查了WMP的WAV文件,即“滴答声”没有记录在声音文件本身中(即从WMP播放时,没有听到滴答声)。您使用的输出驱动程序是什么?您的代码显示的是NativeDirectSoundOut,它已经不存在一段时间了。我使用的是NAudio的旧版本,NativeDirectSoundOut驱动程序仍然可用(至少它没有告诉我它不可用)。我还尝试使用:waveOut=new NAudio.Wave.DirectSoundOut(null,latency);以及waveOut=new waveOut();但是,它一直告诉我需要将windows窗体链接到我没有的waveOut类(我在别处编写所有UI代码)发帖后,我确实尝试了不关闭WaveOut对象-似乎没有任何区别。我还检查了WMP中的WAV文件,声音文件本身没有记录“滴答声”(即从WMP播放时,没有听到滴答声)。您使用的是什么输出驱动程序?您的代码显示NativeDirectSoundOut,它已经不存在一段时间了。我使用的是NAudio的旧版本,NativeDirectSoundOut驱动程序仍然可用(至少它没有告诉我它不可用)。我还尝试使用:waveOut=new NAudio.Wave.DirectSoundOut(null,latency);以及WaveOut=new WaveOut();但是,它一直告诉我需要将windows窗体链接到我没有的WaveOut类(我在别处编写所有UI代码)