Smettere di registratore audio da solo dopo il tempo di ritardo in C # (usando NAudio)

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

  •  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.

È stato utile?

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top