Pare o gravador de áudio por conta própria após o atraso no tempo em C# (usando Naudio)

StackOverflow https://stackoverflow.com/questions/4203736

  •  25-09-2019
  •  | 
  •  

Pergunta

Estou fazendo um áudio gravado usando o Naudio em C# e preciso remover o botão de parada usado e simplesmente interromper a gravação por conta própria após algum tempo.

O código para o evento de registro é

     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);

    }

O botão de parada é dado como

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

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

Preciso interromper a gravação automaticamente dentro do evento CMBreCord_Click. Desde já, obrigado.

Foi útil?

Solução

use um Cronômetro, colocou o Interval e copie o código em cmbStop_Click evento para o timer OnTick evento. Ativar o timer no mbRecord_Click evento e e lembre -se de desativar o cronômetro em cmbStop_Click evento

Editar:

Crie um novo timer e defina seu valor

// Coloque esta linha no seu nível de classe

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

// coloque esses dois no seu construtor de forma logo depois InitializeComponent();

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

Habilite o cronômetro no evento 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;

}

Pare de gravar depois de 1 segundo ..

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;
}

Outras dicas

Uma coisa que você pode querer ter em mente - haverá um DataAvailable ligue de volta depois a chamada para StopRecording (ou durante, dependendo do modelo de retorno de chamada usado), portanto, você pode atrasar o fechamento do WaveFileWriter até escrever tudo.

Dê uma olhada no Gravador de voz Projeto de amostra que usa Naudio e interrompe a gravação após 60 segundos. Eu explico Este artigo Como a gravação é interrompida automaticamente.

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top