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();
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.
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);
}
10149600cookie-checkSo stellen Sie die Mikrofonempfindlichkeit ein, während Sie Audio in Android aufnehmenyes