Deja de grabadora de audio por sí solo después de retardo de tiempo en C # (usando NAudio)

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

  •  25-09-2019
  •  | 
  •  

Pregunta

Estoy haciendo un audio grabado con NAudio en C # y tengo que quitar el botón de parada utilizado y simplemente detener la grabación en su propia después de algún tiempo de retardo.

El código para el evento de registro es

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

    }

El botón de parada se da 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;
    }

necesito para detener la grabación de forma automática dentro del evento cmbRecord_Click. Gracias de antemano.

¿Fue útil?

Solución

utilizar un Timer , establezca la Interval y copiar el código en el evento cmbStop_Click a OnTick evento de temporizador. Activar el temporizador en caso mbRecord_Click y recordar y desactivar el temporizador en el evento cmbStop_Click

Editar

Crear un nuevo temporizador y establezca su valor

// ponga esta línea en su nivel de clase de formulario

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

// ponga estos dos en su formulario constructor justo después InitializeComponent();

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

Activar el temporizador en caso 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;

}

Detener la grabación después 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;
}

Otros consejos

Una cosa que usted puede querer tener en cuenta - habrá una DataAvailable devolución de llamada después la llamada a StopRecording (o durante, dependiendo del modelo de devolución de llamada se utiliza), así que sería bueno para el cierre de retardo la WaveFileWriter hasta que haya escrito todo.

Para consultar el proyecto VoiceRecorder muestra que utiliza NAudio y detiene la grabación después de 60 segundos. Explico en este artículo la forma de grabación es automáticamente detenido.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top