2010-11-17 80 views
1

我正在C#中使用NAudio录制音频,我需要删除使用的停止按钮并在一段时间后自行停止录制。c#中的时间延迟后自行停止录音机(使用NAudio)

备案事件中的代码是

 private void cmbRecord_Click(object sender, EventArgs e) 
    { 
      outputFilename = "file address"; 

      waveInStream = new WaveIn(44100,2); 
      writer = new WaveFileWriter(outputFilename, waveInStream.WaveFormat); 

      waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable); 
      waveInStream.StartRecording(); 


      // Just controling the objects on the screen. 
      cmbRecord.Enabled = false; 
      cmbStop.Enabled = true; 

    } 


    void waveInStream_DataAvailable(object sender, WaveInEventArgs e) 
    { 
     writer.WriteData(e.Buffer, 0, e.BytesRecorded); 
     int secondsRecorded = (int)(writer.Length/writer.WaveFormat.AverageBytesPerSecond); 

    } 

停止按钮给出

 private void cmbStop_Click(object sender, EventArgs e) 
    { 
     waveInStream.StopRecording(); 
     waveInStream.Dispose(); 
     waveInStream = null; 
     writer.Close(); 
     writer = null; 

     cmbRecord.Enabled = true; 
     cmbStop.Enabled = false; 
    } 

我需要自动停止cmbRecord_Click事件内的记录。 在此先感谢。

回答

2

使用Timer,设置Interval并将cmbStop_Click事件中的代码复制到计时器的OnTick事件中。在mbRecord_Click事件启用定时器和&记得关闭计时器cmbStop_Click事件

编辑:

创建一个新的计时器,并设置其值为

//把这个线在你的表单类

水平
System.Windows.Forms.Timer mytimer=new System.Windows.Forms.Timer(); //create a new Timer 

//把这两个到您的形式构造方法仅InitializeComponent()后;

mytimer.Interval=1000; //set the interval to 1 second. 
mytimer.Tick += new EventHandler(mytimer_Tick); 

启用在mbRecord_Click事件定时器

private void cmbRecord_Click(object sender, EventArgs e) 
{ 
      outputFilename = "file address"; 

      waveInStream = new WaveIn(44100,2); 
      writer = new WaveFileWriter(outputFilename, waveInStream.WaveFormat); 

      waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable); 
      waveInStream.StartRecording(); 


      // Just controling the objects on the screen. 
      cmbRecord.Enabled = false; 
      cmbStop.Enabled = true; 

      //Enable the timer to fire 
      mytimer.Enabled = true; 

} 

停止录制1秒后..

你可能要牢记
void mytimer_Tick(object sender, EventArgs e) 
{  
     waveInStream.StopRecording(); 
     waveInStream.Dispose(); 
     waveInStream = null; 
     writer.Close(); 
     writer = null; 

     cmbRecord.Enabled = true; 
     cmbStop.Enabled = false; 
//disable the timer here so it won't fire again... 
     mytimer.Enabled = false; 
} 
+0

谢谢,你能帮助我的代码,我是一个C#的总新手。 – Prateek 2010-11-17 11:38:44

+0

当然,请参阅更新。 – Bolu 2010-11-17 11:54:32

+0

哇,非常感谢 – Prateek 2010-11-17 12:37:13

2

一两件事 - 将有一个DataAvailable回调之后拨打StopRecording(或在此期间,取决于所使用的回拨模式),因此您可能需要延迟关闭WaveFileWriter直到你写完所有东西。

看看使用NAudio的VoiceRecorder示例项目,并在60秒后停止录制。我在this article中解释录音如何自动停止。

long maxFileLength = this.recordingFormat.AverageBytesPerSecond * 60; 

int toWrite = (int)Math.Min(maxFileLength - writer.Length, bytesRecorded); 
if (toWrite > 0) 
    writer.WriteData(buffer, 0, bytesRecorded); 
else 
    Stop();