2016-06-09 4 views
1

portiert ich die MSDN-Capture-Stream Beispiel - https://msdn.microsoft.com/en-us/library/windows/desktop/dd370800Endlosschleife Lesepaketdaten in 1sec Loopback Aufnahme

und modifiziert es für Loopback, genau wie hier zu sehen -

https://github.com/slavanap/WaveRec/blob/754b0cfdeec8d1edc59c60d179867ca6088bbfaa/wavetest.cpp

Also ich bin anfordernden Dauer von 1 Sekunde Aufzeichnung, und tatsächliche Dauer überprüft, dass es 1 Sekunde ist.

Jedoch habe ich in einer Endlosschleife stecken bin in diesem Paket hier zu lesen, packetLength ist immer ein Wert von 448 (numFramesAvailable ist auch 448, ich bin nicht sicher, warum es nie 0 wird als die while-Schleife erwartet wird.

https://github.com/slavanap/WaveRec/blob/754b0cfdeec8d1edc59c60d179867ca6088bbfaa/wavetest.cpp#L208-L232

-Code ist -

 while (packetLength != 0) 
     { 
      // Get the available data in the shared buffer. 
      hr = pCaptureClient->GetBuffer(
            &pData, 
            &numFramesAvailable, 
            &flags, NULL, NULL); 
      EXIT_ON_ERROR(hr) 

      if (flags & AUDCLNT_BUFFERFLAGS_SILENT) 
      { 
       pData = NULL; // Tell CopyData to write silence. 
      } 

      // Copy the available capture data to the audio sink. 
      // hr = pMySink->CopyData(pData, numFramesAvailable, &bDone); 
      // EXIT_ON_ERROR(hr) 

      hr = pCaptureClient->ReleaseBuffer(numFramesAvailable); 
      EXIT_ON_ERROR(hr) 

      hr = pCaptureClient->GetNextPacketSize(&packetLength); 
      EXIT_ON_ERROR(hr) 
     } 

Mein portierten Code in ctypes und ist hier - https://github.com/Noitidart/ostypes_playground/blob/audio-capture/bootstrap.js#L71-L180

+1

Wird irgendetwas im System gespielt? Wie eine MP3-Datei im Media Player. Da Sie Loopback-Aufnahmen machen, dachte ich, es könnten einfach keine Daten an Sie und damit die Schleife weitergeleitet werden. –

+0

Thansk @RomanR. Nein, nichts spielt, aber ich habe die Lautstärke angepasst, um den * ting * Sound zu hören, den Sie von hier kennen: http://i.imgur.com/bqbG56a.png – Noitidart

+0

@RomanR. Ich habe gerade versucht, mit einem Youtube-Video zu spielen, und jetzt bekomme ich 'packetLength: 896' und' numFramesAvailable: 896' aber wieder Endlosschleife. :( – Noitidart

Antwort

1

Ich vermute, es gibt einen versteckten Fehler in Microsoft-Beispiel, der in Ihrem Fall scheint. Die Verarbeitungszeit für die innere Schleife Ihres Codes ist so groß, dass neue Daten im eingehenden Audiopuffer erscheinen, so dass Sie für immer in der inneren Schleife drehen oder bis Sie eingehende Daten mit angemessener Geschwindigkeit verarbeiten können. Also, ich schlage vor, Zustand der inneren Schleife hinzuzufügen.

while (bDone == FALSE) 
{ 
    ... 

    while (packetLength != 0 && bDone == FALSE) 
    { 
     ... 
    } 
} 
+0

Ah das macht Sinn! Ich akzeptiere es sofort und werde versuchen, es anzuwenden. Ich werde dich auf dem Laufenden halten. Vielen Dank! – Noitidart

+0

Hallo hier @slavanap können Sie bitte meinen Code hier sehen - http://stackoverflow.com/q/39951512/1828637 - Ich versuche, einen MP3- oder WAV-Puffer zu machen, damit ich es in Datei schreiben oder hochladen kann, hatte ich eine harte Zeit damit, bitte sehen Sie, ob Sie mir dort helfen können. Ich bin mir nicht sicher, wo ich "bDone" auf "false" setzen soll :( – Noitidart

+1

@Noitidart 'bDone' wird in der' CopyData' -Funktion entsprechend dem 'Strg + C'-Handler gesetzt (weil die Aufnahme ansonsten unendlich ist) Version von WaveRec] (https://github.com/slavanap/WaveRec). Ich habe mehr 'C++' -ähnliche Syntax eingeführt. – slavanap