android:检测声级

Zel*_*Ady 31 audio android

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

两个问题:

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

谢谢.

Ana*_*era 43

  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;

    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*res 6

如果要分析直接从麦克风获取的声音样本而不将数据保存在文件中,则需要按如下方式使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

audio.startRecording();
Run Code Online (Sandbox Code Playgroud)

现在是时候开始阅读样本如下:

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));
Run Code Online (Sandbox Code Playgroud)

最后一个代码组合了所有不同的样本幅度,并将平均值分配给lastLeveL变量,有关详细信息,请参阅此帖子.

问候!

  • 此算法已被破坏 - 您无法添加这样的值,因为这些是有符号值.你必须取*幅度*并平均那些. (3认同)