2017-07-21 4 views
2

J'essaie actuellement d'enregistrer de l'audio via WasapiCapture et WaveWriter (paquet CSCore), et je veux arrêter l'enregistrement après que l'utilisateur arrête de parler. Quelqu'un peut m'aider?C# CSCore arrête l'enregistrement lorsque l'utilisateur arrête de parler

Ce qui m'est venu à l'esprit est que je pourrais potentiellement créer un RecordingVolumeHandler, qui se déclenche lorsque le volume est inférieur à un certain seuil pendant 1 ou 2 secondes. Comment puis-je faire ceci? Existe-t-il une méthode pour obtenir le volume de l'entrée audio en cours d'enregistrement?

Le code suivant est pour les deux fonctions que j'ai pour démarrer l'enregistrement et l'arrêter.

private WasapiCapture capture; 
    private WaveWriter writer; 

     private void startRecording() 
    { 
     capture = new WasapiCapture(); 
     capture.Initialize(); 
     writer = new WaveWriter("file.wav", capture.WaveFormat); 
     capture.DataAvailable += (s, capData) => 
     { 
      writer.Write(capData.Data, capData.Offset, capData.ByteCount); 
     }; 
     capture.Start(); 
    } 

    private void stopRecording() 
    { 
     if (writer != null && capture != null) 
     { 
      capture.Stop(); 
      writer.Dispose(); 
      capture.Dispose(); 
     } 
    } 

Merci d'avance!

Répondre

0

Vous pouvez ajouter une période de silence de comptage Timer. Quand il expire - arrêtez l'enregistrement. Je n'ai pas testé ce code. La minuterie peut ne pas être réinitialisée, mais l'idée devrait être claire.

private WasapiCapture capture; 
private WaveWriter writer; 
private Timer silenceTimer; 

public Constructor() 
{ 
    silenceTimer = new Timer(); 
    silenceTimer.Interval = 5000; // 5 seconds 
    silenceTimer.Elapsed +=SilenceTimerElapsed; 
} 

private void SilenceTimerElapsed(object sender, ElapsedEventArgs e) 
{ 
    silenceTimer.Stop(); 
    stopRecording(); 
} 

private void startRecording() 
{ 
    capture = new WasapiCapture(); 
    capture.Initialize(); 
    writer = new WaveWriter("file.wav", capture.WaveFormat); 
    capture.DataAvailable += (s, capData) => 
    { 
     writer.Write(capData.Data, capData.Offset, capData.ByteCount); 
     silenceTimer.Stop(); 
     silenceTimer.Start(); // Resetting timer 
    }; 

    silenceTimer.Start(); 
    capture.Start(); 
} 

private void stopRecording() 
{ 
    if (writer != null && capture != null) 
    { 
     capture.Stop(); 
     writer.Dispose(); 
     capture.Dispose(); 
    } 
}