So stellen Sie die Mikrofonempfindlichkeit ein, während Sie Audio in Android aufnehmen

Lesezeit: 3 Minuten

Ich arbeite an einer Sprachaufzeichnungs-App. Darin habe ich eine Seekbar, um die Eingangssprachverstärkung zu ändern. Ich konnte keine Möglichkeit finden, die Eingangssprachverstärkung anzupassen.

Ich benutze die AudioRecord Klasse, um die Stimme aufzunehmen.

 recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,
            RECORDER_AUDIO_ENCODING, bufferSize);

    recorder.startRecording();

Ich habe eine gesehen App im Google Play Store mit dieser Funktionalität.

Benutzer-Avatar
Anton Savin

Soweit ich weiß, möchten Sie keine automatischen Anpassungen, sondern nur manuelle Anpassungen über die Benutzeroberfläche. In Android gibt es dafür keine eingebaute Funktion, stattdessen müssen Sie Ihre Daten manuell ändern.

Angenommen, Sie verwenden lesen (kurz[] audioData, int offsetInShorts, int sizeInShorts) zum Lesen des Streams. Sie sollten also einfach so etwas tun:

float gain = getGain(); // taken from the UI control, perhaps in range from 0.0 to 2.0
int numRead = read(audioData, 0, SIZE);
if (numRead > 0) {
    for (int i = 0; i < numRead; ++i) {
        audioData[i] = (short)Math.min((int)(audioData[i] * gain), (int)Short.MAX_VALUE);
    }
}

Math.min wird verwendet, um einen Überlauf zu verhindern, wenn gain ist größer als 1.

  • danke für die Hilfe. Ich habe einige Änderungen an Ihrem Code vorgenommen und mein Problem ist jetzt gelöst.

    Benutzer3472378

    29. August 2014 um 6:34 Uhr

  • Sie müssen auch Math.max (intValue, Short.MIN_VALUE) aufrufen, da Java short signiert ist, siehe meine Antwort unten.

    – Dmid

    10. Juli 2017 um 16:40 Uhr


  • Nur diese Antwort funktioniert nach viel Suche im Netz. Ich musste einstellen gain bis über 7, um einen großartigen Effekt zu sehen! Vielen Dank!

    – Bauer

    15. Dezember 2019 um 10:05 Uhr


Die dynamische Mikrofonempfindlichkeit ist keine Sache, zu der die Hardware oder das Betriebssystem in der Lage ist, da sie eine Analyse des aufgenommenen Tons erfordert. Sie sollten Ihren eigenen Algorithmus implementieren, um den aufgenommenen Ton zu analysieren und den Tonpegel selbst anzupassen (verstärken oder verringern).

Sie können damit beginnen, die letzten paar Sekunden zu analysieren und einen Multiplikator zu finden, der die durchschnittliche Amplitude “ausgleicht”. Der Multiplikator muss umgekehrt proportional zur durchschnittlichen Amplitude sein, um sie auszugleichen.

PS: Wenn Sie es trotzdem tun möchten, können Sie auf die Mikrofonpegel zugreifen, wenn Sie einen Root-Zugriff haben, aber ich bin mir immer noch nicht sicher – und glaube nicht, dass es möglich ist -, ob Sie die Einstellungen während der Aufnahme ändern können. Hinweis: Datei „/system/etc/snd_soc_msm“.

Lösung von OP.

Ich habe es mit gemacht

final int USHORT_MASK = (1 << 16) - 1;

final ByteBuffer buf = ByteBuffer.wrap(data).order(
                        ByteOrder.LITTLE_ENDIAN);
final ByteBuffer newBuf = ByteBuffer.allocate(
                        data.length).order(ByteOrder.LITTLE_ENDIAN);

int sample;
        while (buf.hasRemaining()) {
                sample = (int) buf.getShort() & USHORT_MASK;
                sample *= db_value_global;
                        newBuf.putShort((short) (sample & USHORT_MASK));
                }

                data = newBuf.array();

                os.write(data);

Diese Arbeitsimplementierung basiert auf ByteBuffer für 16bit-Audio. Es ist wichtig, den erhöhten Wert von beiden Seiten zu klemmen, da kurz unterzeichnet wird. Es ist auch wichtig, die native Byte-Reihenfolge auf einzustellen ByteBuffer seit audioRecord.read() gibt native Endian-Bytes zurück.

Vielleicht möchten Sie auch auftreten audioRecord.read() und folgenden Code in einer Schleife aufrufen data.clear() nach jeder Iteration.

    double gain = 2.0;

    ByteBuffer data = ByteBuffer.allocateDirect(SAMPLES_PER_FRAME).order(ByteOrder.nativeOrder());

    int audioInputLengthBytes = audioRecord.read(data, SAMPLES_PER_FRAME);
    ShortBuffer shortBuffer = data.asShortBuffer();
    for (int i = 0; i < audioInputLengthBytes / 2; i++) { // /2 because we need the length in shorts
        short s = shortBuffer.get(i);
        int increased = (int) (s * gain);
        s = (short) Math.min(Math.max(increased, Short.MIN_VALUE), Short.MAX_VALUE);
        shortBuffer.put(i, s);
    }

1014960cookie-checkSo stellen Sie die Mikrofonempfindlichkeit ein, während Sie Audio in Android aufnehmen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy