2015-07-10 122 views
1

我試圖顯示錄製時間與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(); 
     } 
    } 

回答

0

您在每次打勾時更新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

相關問題