Deja de grabadora de audio por sí solo después de retardo de tiempo en C # (usando NAudio)
-
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.
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();