AudioRecord - Wie bekomme ich Daten in den Puffer?

8

Ich habe Probleme mit der AudioRecord-Klasse. Ich möchte aufgezeichnete Daten in einem Puffer speichern, aber ich bin mir nicht sicher, was der richtige Weg ist, um das zu erreichen. Ich habe eine große Anzahl von Beispielen durchgespielt, aber die meisten waren kompliziert und repräsentierten viele verschiedene Ansätze. Ich suche nach einer einfachen oder einfachen Erklärung.

Hier sind meine Audioeinstellungen für mein Projekt:

%Vor%

Ich versuche eine Aufnahmefunktion zu erstellen:

%Vor%

Ich weiß, dass ich die Funktion .read (kurz [] audioData, int offsetInShorts, int sizeInShorts) verwenden soll. Und hier fangen meine Probleme an. Ich bin mir nicht sicher, wie AudioData Buffer funktioniert - ich nehme an, Funktion legt aufgezeichnete Samples in die AudioData. Was passiert, wenn es vollständig mit Daten gefüllt ist? Es fängt an, von der frühesten Position neu zu schreiben? Wenn es das tut, glaube ich, dass ich alle gesammelten Samples irgendwo anders kopieren muss. Es wirft eine andere Frage auf - wie kann ich überprüfen, ob .read (...) Funktionspuffer bereits voll ist? Muss ich die Zeit messen und Pufferinhalte kopieren, oder gibt es eine andere Möglichkeit, das zu erreichen? Muss ich auch einen Thread für den gesamten Aufzeichnungsvorgang erstellen?

Entschuldige, dass du so viele Fragen in einem Thema gestellt hast:)

    
Arxas 21.11.2012, 11:51
quelle

1 Antwort

3

Beantworten Sie Ihre Fragen ::

recorder.read (...) liest nicht unbedingt irgendwelche Daten. Sie sollten diese Schleife wahrscheinlich neu schreiben, um für kurze Zeit (z. B. 50 ms) zwischen zu lesenden Aufrufen zu pausieren. Es sollte den Puffer auch nicht in die Warteschlange stellen, bis der Puffer Daten enthält. Da der Puffer möglicherweise nicht voll ist, müssen Sie wahrscheinlich eine Datenstruktur verwenden, die die Anzahl der Bytes verwaltet. Ein ByteBuffer kommt mir als guter Kandidat in den Sinn. Sie können Bytes in die Read-Schleife stopfen und wenn es voll genug ist, in die Warteschlange für die Übertragung und starten Sie eine andere.

natürlich müssen Sie einen Thread für das Looping erstellen. wie im folgenden Code gezeigt.

Hier ist eine modifizierte Version der Aufnahmeschleife, die eine korrekte Fehlerprüfung durchführt. Es verwendet Queue<ByteBuffer> anstelle von Queue<byte[]> :

%Vor%

Natürlich müssen Sie irgendwo recorder.startRecording() aufrufen oder Sie erhalten keine Daten.

zum Arbeiten Beispiel schauen in diesem Beispiel .

    
Rahul Baradia 21.11.2012, 12:01
quelle

Tags und Links