Arrêtez l'enregistreur audio lui-même après un délai de temps en c # (en utilisant NAudio)
-
25-09-2019 - |
Question
Je fais un audio enregistré en utilisant NAudio en C # et je dois enlever le bouton d'arrêt utilisé et simplement arrêter l'enregistrement lui-même après un certain délai.
Le code pour l'événement d'enregistrement est
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);
}
Le bouton d'arrêt est donnée à titre
private void cmbStop_Click(object sender, EventArgs e)
{
waveInStream.StopRecording();
waveInStream.Dispose();
waveInStream = null;
writer.Close();
writer = null;
cmbRecord.Enabled = true;
cmbStop.Enabled = false;
}
Je dois arrêter l'enregistrement automatiquement dans l'événement cmbRecord_Click. Merci à l'avance.
La solution
utiliser un minuterie , définissez la Interval
et copiez le code dans l'événement de cmbStop_Click
sur à l'événement OnTick
de minuterie. Activer la minuterie en cas de mbRecord_Click
et & oubliez pas de désactiver la minuterie en cas de cmbStop_Click
Modifier
Créer une nouvelle minuterie et définissez sa valeur
// mettez cette ligne dans votre formulaire niveau de la classe
System.Windows.Forms.Timer mytimer=new System.Windows.Forms.Timer(); //create a new Timer
// mettez ces deux dans votre constructeur de forme juste après InitializeComponent()
;
mytimer.Interval=1000; //set the interval to 1 second.
mytimer.Tick += new EventHandler(mytimer_Tick);
Activer la minuterie en cas 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;
}
Arrêter l'enregistrement après 1 seconde ..
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;
}
Autres conseils
Une chose que vous voudrez peut-être garder à l'esprit - il y aura un rappel DataAvailable
après l'appel à StopRecording
(ou pendant, selon le modèle de rappel utilisé), de sorte que vous pouvez retarder la fermeture le WaveFileWriter jusqu'à ce que vous avez tout ce qu'il écrit.
Jetez un oeil à l'exemple de projet VoiceRecorder qui utilise NAudio et cesse d'enregistrer au bout de 60 secondes. Je l'explique dans cet article comment enregistrement est automatiquement arrêté.
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();