我正在制作录音应用程序。在app中我有一个Seekbar来改变输入语音增益。 我找不到任何调整输入语音增益的方法。
我正在使用AudioRecord课程录制语音。
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
RECORDER_SAMPLERATE, RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING, bufferSize);
recorder.startRecording();
我在Play商店中看到过一个使用此功能的应用程序。
https://play.google.com/store/apps/details?id=com.grace.microphone
答案 0 :(得分:13)
据我了解,您不需要任何自动调整,只需手动操作系统即可。 Android中没有内置功能,您必须手动修改数据。
假设您使用read (short[] audioData, int offsetInShorts, int sizeInShorts)来阅读流。所以你应该做这样的事情:
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
大于1, gain
用于防止溢出。
答案 1 :(得分:3)
动态麦克风灵敏度不是硬件或操作系统所能满足的,因为它需要对录制的声音进行分析。您应该实施自己的算法来分析录制的声音并自行调整(放大或降低)声级。
你可以从分析最后几秒开始,找到一个能够平衡&#34;平均幅度。乘数必须与平均幅度成反比才能平衡它。
PS:如果您仍想这样做,当您拥有root权限时,可以访问麦克风级别,但我仍然不确定 - 并且不认为可能 - 如果您可以更改设置记录。提示:&#34; / system / etc / snd_soc_msm&#34;文件。
答案 2 :(得分:0)
OP解决方案。
我已经使用
完成了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);
答案 3 :(得分:-1)
这是基于ByteBuffer
的16位音频工作实现。因为签署了短期,所以必须从双方来限制增加的价值。将本机字节顺序设置为ByteBuffer
也很重要,因为audioRecord.read()
返回本机字节字节。
您可能还希望执行audioRecord.read()
并在循环中跟随代码,在每次迭代后调用data.clear()
。
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);
}