如何在使用NAudio录制时显示录制时间?

问题描述:

我试图显示录制时间与NAudio库使用C#窗口窗体Timer.This是Code我试图实现的代码。我有这个代码的问题是,计时器的时间不符合长度录音。我希望定时器的定时和录制时间同步!如何在使用NAudio录制时显示录制时间?

private void buttonStart_Click(object sender, EventArgs e) 
    { 

     buttonStart.Enabled = false; 
     buttonStop.Enabled = true; 

     waveSource = new WaveIn(); 
     waveSource.WaveFormat = new WaveFormat(44100, 2); 

     waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable); 
     waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped); 

     waveFile = new WaveFileWriter(@"C:\one\Test0010.wav", waveSource.WaveFormat); 
     waveSource.StartRecording(); 

     } 
    void waveSource_DataAvailable(object sender, WaveInEventArgs e) 
    { 

     if (waveFile != null) 
     { 

      timerSoundRecord.Start(); 
      waveFile.Write(e.Buffer, 0, e.BytesRecorded); 
      waveFile.Flush(); 
      var lenght = (int)(waveFile.Length/waveFile.WaveFormat.AverageBytesPerSecond); 

      if (lenght == 6) 
      { 
       timerSoundRecord.Stop(); 
       waveSource.StopRecording(); 
       buttonStop.Enabled = false; 
       buttonStart.Enabled = true; 
      } 



     } 
    } 

private void timerSoundRecord_Tick(object sender, EventArgs e) 
    { 

     if (progressBarRecordSound.Value != 6) 
     { 


      seconds = seconds + 1; 

      labelTime.Text = @"00:0" + seconds; 
      progressBarRecordSound.Value++; 
     } 
     else 
     { 
      timerSoundRecord.Stop(); 
     } 
    } 

您在每次打勾时更新timerSoundRecord_Tick中的秒数。这些测量非常不同。

只需从waveSource_DataAvailable全局方法创建您的长度变量,然后在timerSoundRecord_Tick中检查它,而不是使用您正在增加的变量秒。

private void buttonStart_Click(object sender, EventArgs e) 
{ 

    buttonStart.Enabled = false; 
    buttonStop.Enabled = true; 

    waveSource = new WaveIn(); 
    waveSource.WaveFormat = new WaveFormat(44100, 2); 

    waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable); 
    waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped); 

    waveFile = new WaveFileWriter(@"C:\one\Test0010.wav", waveSource.WaveFormat); 
    waveSource.StartRecording(); 
    timerSoundRecord.Start(); 
    } 

int length = 0; 
void waveSource_DataAvailable(object sender, WaveInEventArgs e) 
{ 
    if (waveFile != null) 
    {   
     waveFile.Write(e.Buffer, 0, e.BytesRecorded); 
     waveFile.Flush(); 
     var lenght = (int)(waveFile.Length/waveFile.WaveFormat.AverageBytesPerSecond); 

     if (lenght == 6) 
     { 
      timerSoundRecord.Stop(); 
      waveSource.StopRecording(); 
      labelTime.Text = @"00:0" + length; 
      progressBarRecordSound.Value++; 
      buttonStop.Enabled = false; 
      buttonStart.Enabled = true; 
     } 
    } 
} 

private void timerSoundRecord_Tick(object sender, EventArgs e) 
{ 
     labelTime.Text = @"00:0" + length; 
     progressBarRecordSound.Value++; 
} 
+0

您可以使用秒表添加任何示例吗?以及如何使用时间跨度尝试显示标签,但它不起作用!谢谢你 – bunny8989

+0

我想你不需要秒表,因为你可以像使用waveSource_DataAvailable方法中的长度一样获得流逝的时间。我用新建议编辑了我的答案。 – Craveiro

+0

但是我应该什么时候开始计时?在StartRecording方法或Data_Available事件之前? – bunny8989