AudioRecord - wie bekomme ich Daten in den Puffer?
Ich' m haben einige Probleme mit AudioRecord-Klasse. Ich möchte zum speichern von aufgezeichneten Daten in einem Puffer, aber ich' m nicht sicher was ist der richtige Weg, das zu erreichen. Ich ging durch die große Anzahl der Beispiele, aber die meisten von Ihnen wurden dadurch erschwert und für viele verschiedene Ansätze. Ich' m auf der Suche für einfache oder zu einfache Erklärung.
Hier meine audio-Einstellungen für mein Projekt:
int audioSource = AudioSource.MIC;
int sampleRateInHz = 8000;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
short[] buffer = new short[bufferSizeInBytes];
AudioRecord audioRecorder = new AudioRecord(audioSource,
sampleRateInHz,
channelConfig,
audioFormat,
bufferSizeInBytes);
Ich' m versuchen, um eine Aufnahme-Funktion:
public void Recording() {
audioRecorder.startRecording();
...
audioRecorder.stop();
audioRecorder.release();
}
Ich weiß, dass ich' m nutzen soll .Lesen(short[] von Audiodateien, int offsetInShorts, int sizeInShorts) - Funktion. Und hier meine Probleme starten. Ich' m nicht sicher, wie Sie Sie von Audiodateien Puffer funktioniert - ich nehme an, die Funktion setzt den gespeicherten samples in das von Audiodateien. Was passiert, wenn es vollständig mit Daten gefüllt? Es beginnt das umschreiben von den frühesten position? Wenn es nicht, ich glaube, ich habe das kopieren aller gesammelten Proben irgendwo sonst. Es wirft eine weitere Frage - wie kann ich überprüfen, ob .Lesen (...) - Funktion Puffer bereits voll ist? Brauche ich, um die Zeit zu Messen und kopieren von Puffer-Inhalten oder gibt es einen anderen Weg, um zu erreichen, dass? Auch brauche ich zum erstellen von einem thread für die ganze Aufnahme-Betrieb?
Sorry für die Fragen, so viele Fragen in einem Thema 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort auf Ihre Fragen ::
recorder.Lesen Sie(...) nicht unbedingt Lesen alle Daten auf allen. Sie soll wohl umschreiben, die Schleife zu unterbrechen für eine kurze Zeit (z.B. 50 MS) zwischen den anrufen zu Lesen. Es sollte auch nicht in der Warteschlange der Puffer, bis der Puffer Daten enthält. Auch, da der Puffer kann nicht zu voll sein, müssen Sie wahrscheinlich verwenden eine Datenstruktur, die unterhält eine Zählung der Anzahl von bytes. Ein ByteBuffer in den Sinn kommt als ein guter Kandidat. Sie können Zeug bytes in es in der lese-Schleife und wenn es voll genug ist, Warteschlange für die übertragung und den anderen starten.
offcourse, Sie müssen erstellen, einen thread für Schleifen es. wie dargestellt, in folgenden code.
Hier ist eine modifizierte version der Aufzeichnung Schlaufe richtigen Fehler zu überprüfen. Es verwendet eine
Queue<ByteBuffer>
statt einerQueue<byte[]>
:Natürlich, irgendwo müssen Sie rufen
recorder.startRecording()
oder Sie erhalten keine Daten.zum Beispiel arbeiten Aussehen bei diesem Beispiel.