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.

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.
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