如何在Android中录制音频时调整麦克风灵敏度

时间:2014-08-22 06:52:25

标签: java android audiorecord android-audiorecord

我正在制作录音应用程序。在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

4 个答案:

答案 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);
    }