【发布时间】:2016-12-14 08:38:06
【问题描述】:
我使用 NAudio 编写了这两个函数来记录和写入波形文件。如果不执行最后一行并超出本地范围,我找不到停止第一个函数的策略。
audio_Rec 方法从 main 函数调用,audioSource_DataAvailable 函数在 WaveInEvent 中有缓冲数据时执行。我认为, audioSource_DataAvailable 函数仅在 audio_Rec 方法的范围内运行,并且当代码到达 audio_Rec 的最后一行时(下一行) ,
Console.Write("Recording Starts...\n");
它超出范围并执行主函数的下一行。 (主要没有提到)。我想要一种方法在录制音频时保持 audio_Rec 方法,直到在 audioSource_DataAvailable 函数中的给定条件下停止录制。
count 和 summation 是公共成员变量。
audio_Rec 方法
public void audio_Rec()
{
audioSource = new WaveInEvent();
audioSource.DeviceNumber = 0;
audioSource.WaveFormat = new WaveFormat(16000, 16, 1);
audioSource.DataAvailable += new EventHandler<WaveInEventArgs>(audioSource_DataAvailable);
waveFile = new WaveFileWriter(@"d:/dev/csharp/wspeechrec/new_wave.wav", audioSource.WaveFormat);
audioSource.StartRecording();
Console.Write("Recording Starts...\n");
//Thread.Sleep(7000);
}
audioSource_DataAvailable 函数
void audioSource_DataAvailable(object sender, WaveInEventArgs e)
{
count++;
if (count%5 == 0)
{
if (summation < 150000) {
audioSource.StopRecording();
Console.Write("Recording Stopped!");
}
Console.WriteLine(count * 100 + "ms :"+summation);
summation = 0;
}
Console.WriteLine(count+" "+summation);
byte[] buf = new byte[e.BytesRecorded];
buf = e.Buffer;
int[] Ints = new int[e.BytesRecorded / 2];
for(int i=0;i<buf.Length;i+=2)
{
Ints[i/2] = BitConverter.ToInt16(buf, i);
}
int[] newInts = Ints.Select(x => Math.Abs(x)).ToArray();
summation = newInts.Sum();
if (waveFile != null)
{
waveFile.Write(e.Buffer, 0, e.BytesRecorded);
waveFile.Flush();
}
}
可以随意忽略第二个函数中的算法。他们可以被忽略。 非常感谢任何帮助。谢谢
【问题讨论】:
标签: c# audio-recording naudio