Stoppen Sie Audio-Recorder auf seinem eigenen nach Zeitverzögerung in c # (mit NAudio)

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

  •  25-09-2019
  •  | 
  •  

Frage

Ich bin eine Audio mit NAudio in C # aufgezeichnet und ich brauche die Stopp-Taste verwendet entfernen und einfach die Aufnahme stoppen auf seinem eigenen nach einiger Zeitverzögerung.

Der Code für das Protokoll Ereignis

     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);

    }

Die Stopptaste ist gegeben als

      private void cmbStop_Click(object sender, EventArgs e)
    {
        waveInStream.StopRecording();
        waveInStream.Dispose();
        waveInStream = null;
        writer.Close();
        writer = null;

        cmbRecord.Enabled = true;
        cmbStop.Enabled = false;
    }

Ich brauche die Aufnahme automatisch in dem cmbRecord_Click Ereignisse zu stoppen. Vielen Dank im Voraus.

War es hilfreich?

Lösung

Verwenden Sie einen Timer , stellen die Interval und kopieren Sie den Code in cmbStop_Click Ereignis über OnTick Ereignis des Timer. Aktivieren Sie den Timer in der mbRecord_Click Ereignis und & erinnere mich an den Timer in cmbStop_Click Ereignis deaktivieren

Edit:

Erstellen Sie einen neuen Timer und setzen Sie den Wert

// setzen Sie diese Zeile in dem Formular Klassenstufe

  System.Windows.Forms.Timer mytimer=new System.Windows.Forms.Timer(); //create a new Timer

// diese beiden in das Formular Konstruktor setzen kurz nach InitializeComponent();

mytimer.Interval=1000; //set the interval to 1 second.
mytimer.Tick += new EventHandler(mytimer_Tick);

Aktivieren Sie den Timer im mbRecord_Click Ereignisse

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;

}

Halten Sie die Aufnahme nach 1 Sekunde ..

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;
}

Andere Tipps

Eine Sache, Sie können im Auge behalten wollen - es wird eine DataAvailable Rückruf nach der Anruf an StopRecording (oder während auf dem Callback-Modell abhängig verwendet), so dass Sie Verzögerung Schließen mögen vielleicht die WaveFileWriter bis Sie geschrieben haben alles.

Haben Sie einen Blick auf die Voicerecorder Beispielprojekt, das NAudio verwendet und stoppt nach 60 Sekunden der Aufnahme. Ich erkläre in diesem Artikel wie die Aufnahme automatisch ist gestoppt.

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top