Smettere di registratore audio da solo dopo il tempo di ritardo in C # (usando NAudio)
-
25-09-2019 - |
Domanda
Sto facendo un audio registrato utilizzando NAudio in C # e ho bisogno di rimuovere il pulsante di arresto utilizzata e semplicemente interrompere la registrazione da solo dopo un certo ritardo di tempo.
Il codice per l'evento record è
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);
}
Il pulsante di arresto è dato come
private void cmbStop_Click(object sender, EventArgs e)
{
waveInStream.StopRecording();
waveInStream.Dispose();
waveInStream = null;
writer.Close();
writer = null;
cmbRecord.Enabled = true;
cmbStop.Enabled = false;
}
Ho bisogno di fermare automaticamente la registrazione all'interno della manifestazione cmbRecord_Click. Grazie in anticipo.
Soluzione
Timer , impostare il Interval
e copiare il codice nell'evento cmbStop_Click
oltre all'evento OnTick
di timer. Attivare il timer in caso mbRecord_Click
e & ricordarsi di disattivare il timer in caso cmbStop_Click
Modifica
Creare un nuovo timer e impostare il suo valore
// mettere questa riga nel vostro livello di classe form
System.Windows.Forms.Timer mytimer=new System.Windows.Forms.Timer(); //create a new Timer
// messo questi due nel vostro costruttore del form appena dopo InitializeComponent()
;
mytimer.Interval=1000; //set the interval to 1 second.
mytimer.Tick += new EventHandler(mytimer_Tick);
Attiva il timer in 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;
}
Interrompi registrazione dopo 1 secondo ..
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;
}
Altri suggerimenti
Una cosa che si può decidere di tenere a mente - ci sarà un DataAvailable
callback dopo la chiamata a StopRecording
(o durante, a seconda del modello di callback utilizzata), quindi si potrebbe desiderare di chiusura ritardo il WaveFileWriter fino ad avere scritto tutto.
Date un'occhiata al href="http://voicerecorder.codeplex.com" rel="nofollow"> VoiceRecorder progetto di esempio che utilizza NAudio e interrompe la registrazione dopo 60 secondi. Spiego in questo articolo come la registrazione viene automaticamente fermato.
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();