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