1

我正在使用 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 事件中自动停止录制。提前致谢。

4

2 回答 2

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;
}
于 2010-11-17T11:14:52.123 回答
2

您可能需要记住一件事 - 在调用之后(或期间,取决于所使用的回调模型)会有一个DataAvailable回调,因此您可能希望延迟关闭 WaveFileWriter,直到您编写完所有内容。StopRecording

查看使用 NAudio 并在 60 秒后停止录制的VoiceRecorder示例项目。我在本文中解释了如何自动停止录制。

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();
于 2010-11-18T07:17:26.140 回答