35

使用MediaRecorder我从设备的麦克风捕获声音。从我得到的声音中,我只需要分析音量(声音响度),而无需将声音保存到文件中。

两个问题:

  1. 如何在给定时刻获得声音的响度?
  2. 如何在不将声音保存到文件的情况下进行分析?

谢谢你。

4

3 回答 3

49
  1. 采用mRecorder.getMaxAmplitude();

  2. 为了分析声音而不保存所有你需要的就是使用mRecorder.setOutputFile("/dev/null");

这是一个例子,我希望这会有所帮助

public class SoundMeter {

    private MediaRecorder mRecorder = null;

    public void start() {
            if (mRecorder == null) {
                    mRecorder = new MediaRecorder();
                    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    mRecorder.setOutputFile("/dev/null"); 
                    mRecorder.prepare();
                    mRecorder.start();
            }
    }

    public void stop() {
            if (mRecorder != null) {
                    mRecorder.stop();       
                    mRecorder.release();
                    mRecorder = null;
            }
    }

    public double getAmplitude() {
            if (mRecorder != null)
                    return  mRecorder.getMaxAmplitude();
            else
                    return 0;

    }
}
于 2013-01-06T11:38:23.353 回答
8

如果要分析直接从麦克风获取的声音样本而不将数据保存在文件中,则需要使用 AudioRecord 对象,如下所示:

int sampleRate = 8000;
try {
    bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO,
        AudioFormat.ENCODING_PCM_16BIT);
    audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSize);
} catch (Exception e) {
    android.util.Log.e("TrackingFlow", "Exception", e);
}

然后你必须在准备好后开始录制:

audio.startRecording();

现在是时候开始阅读示例了,如下所示:

short[] buffer = new short[bufferSize];

    int bufferReadResult = 1;

    if (audio != null) {

        // Sense the voice...
        bufferReadResult = audio.read(buffer, 0, bufferSize);
        double sumLevel = 0;
        for (int i = 0; i < bufferReadResult; i++) {
            sumLevel += buffer[i];
        }
        lastLevel = Math.abs((sumLevel / bufferReadResult));

最后一个代码结合了所有不同的样本幅度并将平均值分配给 lastLeveL 变量,有关更多详细信息,您可以转到这篇文章

问候!

于 2014-01-03T22:10:06.260 回答
3

我玩了一些录音源代码应用程序,但花了一段时间才得到它。

您可以复制 Google 的 NoiseAlert 源代码——我使用的 SoundMeter 代码。

getMaxAmplitude 范围从 0 到 32768。我懒得使用的 EMA 东西。

在您的主要活动中,您必须声明一个 MediaRecorder 对象并按照 Anna 引用的方式调用它的 start() 函数。

有关更多信息,您可以参考我的项目: http: //kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-ie-how-to-transmit-send-data-from -android-to-arduino-bluesmirf-silver-using-bluetooth/ 我需要通过蓝牙发送声音幅度的值。

确切的代码在这里:https ://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin

只需浏览与关联的 MediaRecorder 对象有关的部分即可。

于 2013-03-25T10:48:31.343 回答