[JAVA] Verstehen Sie die Grundlagen von Android Audio Record

Ich habe die AudioRecord-Klasse verwendet, um die Audioverarbeitung unter Android durchzuführen. Dies ist ein bisschen wie ein Songwriter, und ich habe auf einige japanische Seiten verwiesen, aber ich befürchte, dass die Spezifikationen viele vage Teile enthalten ...

Es mag schwierig sein, ohne Grundkenntnisse in der Sprachverarbeitung zu verstehen, aber es gibt viele APIs wie "positionNotificationPeriod" und "notificationMarkerPosition", dass Sie nicht verstehen, was anders ist.

Daher werde ich eine Notiz (Code mit Kommentaren) des offiziellen Dokuments und der im lokalen Test untersuchten Spezifikationen hinterlassen.

AudioRecordSample.kt



import android.media.AudioFormat
import android.media.AudioRecord
import android.media.MediaRecorder
import android.util.Log
import kotlin.math.max

/**
 *Beispielcode für die AudioRecord-Klasse
 */
class AudioRecordSample {

    //Abtastrate(Hz)
    //Die gesamte Geräteunterstützungsgarantie beträgt nur 44100
    private val samplingRate = 44100

    //Bildrate(fps)
    //Wie oft möchten Sie Audiodaten pro Sekunde verarbeiten?
    //Entscheide selbst
    private val frameRate = 10

    //1 Bild Audio-Daten(=Kurzwert)Anzahl der
    private val oneFrameDataCount = samplingRate / frameRate

    //Anzahl der Bytes von Audiodaten in einem Frame(byte)
    // Byte = 8 bit, Short =Weil es 16 Bit ist,Doppelter Kurzschluss
    private val oneFrameSizeInByte = oneFrameDataCount * 2

    //Größe des Audiodatenpuffers(byte)
    //Anforderung 1:Muss größer als oneFrameSizeInByte sein
    //Anforderung 2:Muss größer sein als das vom Gerät geforderte Minimum
    private val audioBufferSizeInByte =
            max(oneFrameSizeInByte * 10, //Passend dazu ein Puffer für 10 Frames
                    android.media.AudioRecord.getMinBufferSize(samplingRate,
                            AudioFormat.CHANNEL_IN_MONO,
                            AudioFormat.ENCODING_PCM_16BIT))

    fun startRecording() {

        //Instanz erstellen
        val audioRecord = AudioRecord(
                MediaRecorder.AudioSource.MIC, //Audio quelle
                samplingRate, //Abtastrate
                AudioFormat.CHANNEL_IN_MONO, //Kanaleinstellungen.MONO und STEREO garantieren Unterstützung für alle Geräte
                AudioFormat.ENCODING_PCM_16BIT, //PCM16 garantiert Unterstützung für alle Geräte
                audioBufferSizeInByte) //Puffer

        //Wie viele Sprachdaten sollen verarbeitet werden?( =Anzahl der Daten in einem Frame)
        audioRecord.positionNotificationPeriod = oneFrameDataCount

        //Zu dem Zeitpunkt, zu dem die hier angegebene Nummer erreicht ist,Anschließend wird onMarkerReached aufgerufen
        //Scheint es nicht notwendig für eine normale Streaming-Verarbeitung?
        audioRecord.notificationMarkerPosition = 40000 //Nicht einstellen, wenn nicht verwendet.

        //Array zum Speichern von Sprachdaten
        val audioDataArray = ShortArray(oneFrameDataCount)

        //Rückruf angeben
        audioRecord.setRecordPositionUpdateListener(object : AudioRecord.OnRecordPositionUpdateListener {

            //Verarbeitung für jeden Frame
            override fun onPeriodicNotification(recorder: AudioRecord) {
                recorder.read(audioDataArray, 0, oneFrameDataCount) //Audiodaten lesen
                Log.v("AudioRecord", "onPeriodicNotification size=${audioDataArray.size}")
                //Verarbeiten Sie nach Belieben
            }

            //Marker-Timing-Verarbeitung.
            //Wird aufgerufen, wenn notificationMarkerPosition erreicht ist
            override fun onMarkerReached(recorder: AudioRecord) {
                recorder.read(audioDataArray, 0, oneFrameDataCount) //Audiodaten lesen
                Log.v("AudioRecord", "onMarkerReached size=${audioDataArray.size}")
                //Verarbeiten Sie nach Belieben
            }
        })

        audioRecord.startRecording()
    }
}

Es ist nur einfach. Ich werde es noch einmal schreiben, wenn ich fortgeschrittenere Erkenntnisse wie die Leistung erhalten kann.

Recommended Posts

Verstehen Sie die Grundlagen von Android Audio Record
Über die Grundlagen der Android-Entwicklung
Docker-Überwachung - Erläuterung der Grundlagen der Grundlagen
[Für Anfänger] Verstehen Sie schnell die Grundlagen von Java 8 Lambda
Verstehen Sie den grundlegenden Mechanismus von log4j2.xml
Die Grundlagen von SpringBoot + MyBatis + MySQL
[Herausforderung CircleCI von 0] Lernen Sie die Grundlagen von CircleCI
Verstehe die offizielle Probe Coffee of Dagger2
Jetzt habe ich die Grundlagen von RecyclerView zusammengefasst
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Rückblick auf die Grundlagen von Java
Was ist JSP? ~ Lassen Sie uns die Grundlagen von JSP kennen !! ~
[Ruby] Zusammenfassung der Klassendefinitionen. Beherrsche die Grundlagen.
[Android] [Java] Verwalten Sie den Status der CheckBox von ListView
Ich habe die Grundlagen der Zeicheneingabe verstanden
Grundlagen von jQuery, die selbst Freeter verstehen können
Die Geschichte der Optimierung der Android-App mit libGDX
Grundlagen von Ruby
Lesen Sie die offizielle Dagger2-Dokumentation, um die Grundlagen zu verstehen
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
Ich habe die Listenansicht der Android-Entwicklung gemeinsam gesehen
Verstehen Sie die Eigenschaften von Scala in 5 Minuten (Einführung in Scala)
<Android> Ändern Sie die Hintergrundfarbe der List-Zeile von ListView
[Android] So erhalten Sie die Einstellungssprache des Terminals
Ich habe die Typen und Grundlagen von Java-Ausnahmen zusammengefasst
[Ruby] Klassenverschachtelung, Vererbung und die Grundlagen des Selbst
Eine Aufzeichnung über das Studium des Spring Framework von Grund auf neu
[Android] Tippen Sie auf den Ankerlink in WebViewClient
Die Welt der Clara-Regeln (2)
Beurteilung des Kalenders
Die Welt der Clara-Regeln (4)
Die Welt der Clara-Regeln (1)
Lassen Sie uns die Funktion verstehen!
Die Welt der Clara-Regeln (3)
Grundlagen der Try-with-Resources-Anweisung
Die Welt der Clara-Regeln (5)
Die Idee der schnellen Sortierung
Definition von Android-Konstanten
Die Idee von jQuery
Ich habe das Verhalten von Java Scanner und .nextLine () nicht wirklich verstanden.
Informationen zum Abschneiden von Zeichenfolgen um die Anzahl der Bytes unter Android
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
[Android] Beenden Sie die Aktivität der Übergangsquelle zum Zeitpunkt des Bildschirmübergangs
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Befolgen Sie das Memorandum zur Funktionszuordnung (verstehen Sie die Beschreibung des Benutzermodells).
[Zusammenfassung der technischen Bücher] Zusammenfassung der Lektüre "Lernen Sie Docker aus den Grundlagen"