Pare o gravador de áudio por conta própria após o atraso no tempo em C# (usando Naudio)
-
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.
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();