Frage

Ich schreibe eine iPhone-Anwendung, die Audio aus dem integrierten Mikrofon aufzeichnen und diese Audiodaten zur Verarbeitung an einen Server senden muss.

Die Anwendung verwendet eine Socket -Verbindung, um eine Verbindung zum Server- und Audio -Warteschlangendiensten herzustellen, um die Aufzeichnung durchzuführen. Ich bin mir nicht sicher, wann ich die Daten tatsächlich senden soll. Audio Queue Services füllt jedes Mal einen Rückruf, wenn er einen Puffer mit einigen Audiodaten ausgefüllt hat. NSoutputStream feuert jedes Mal ein Ereignis aus, wenn es Platz bietet.

Mein erster Gedanke war, die Daten auf den Audio -Warteschlangen -Rückruf an den Server zu senden. Aber es scheint, als würde dies ein Problem sein, wenn der NSoutputStream zu diesem Zeitpunkt keinen Platz zur Verfügung hat.

Dann dachte ich darüber nach, die Daten zu puffern, da sie von der Audiowarteschlange zurückkommt und jedes Mal einige gesendet habe, wenn der NSoutputStream einen verfügbaren Speicherplatz ausfeuert. Dies scheint jedoch ein Problem zu haben, wenn das Senden des Servers der Audioaufzeichnung voraus ist, dann wird es eine Situation geben, in der nichts über das verfügbare Platz für den Platz zu schreiben ist, sodass das Ereignis nicht erneut abgefeuert wird und die Datenübertragung wird effektiv ins Stocken geraten.

Was ist der beste Weg, um damit umzugehen? Sollte ich einen Timer haben, der wiederholt feuert und feststellen, ob Platz verfügbar ist und Daten gesendet werden müssen? Ich denke auch, ich muss eine Thread -Synchronisation durchführen, damit ich Datenstöcke aus meinem Puffer herausnehmen kann, um das Netzwerk über das Netzwerk zu senden, aber auch Datenbrocken zum Puffer hinzuzufügen, wenn die Aufzeichnung fortgesetzt wird, ohne den Manging meines Puffer zu riskieren.

War es hilfreich?

Lösung

Sie können einen Ringpuffer verwenden, um eine bestimmte Anzahl von Audio -Frames und Drop -Frames zu halten, wenn der Puffer eine bestimmte Größe überschreitet. Wenn Ihr Stream-Space-verfügbarer Rückruf aufgerufen wird, ziehen Sie einen Rahmen aus dem Ringpuffer und senden Sie ihn.

Chdatastrukturen Bietet ein paar Ring-Puffer (die es als „Rundpuffer“) Klassen anbietet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top