gpt4 book ai didi

android - 我想检查android中的声音响度

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:19 24 4
gpt4 key购买 nike

我正在开发一个必须检测声音响度的应用程序。意味着一些在手机上的喊叫声,它会在屏幕上显示响度级别。

可以为此使用哪个 API?

最佳答案

http://developer.android.com/reference/android/media/AudioRecord.html

当您读取缓冲区时,字节值将代表振幅。字节值越大声音越大。

这是我前段时间写的一个应用程序中使用的东西的缩小版本:

将此添加到您的 mainifest.xml
<uses-permission android:name="android.permission.RECORD_AUDIO" />

声级.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ToggleButton
android:id="@+id/togglebutton_record"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ToggleButton" />


<ProgressBar
android:id="@+id/progressbar_level"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>

声级.java

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.widget.CompoundButton;
import android.widget.ProgressBar;
import android.widget.ToggleButton;

public class SoundLevel extends Activity {

private static final int sampleRate = 11025;
private static final int bufferSizeFactor = 10;

private AudioRecord audio;
private int bufferSize;

private ProgressBar level;

private Handler handler = new Handler();

private int lastLevel = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.soundlevel);

level = (ProgressBar) findViewById(R.id.progressbar_level);

level.setMax(32676);

ToggleButton record = (ToggleButton) findViewById(R.id.togglebutton_record);

record.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub

if (isChecked) {
bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT) * bufferSizeFactor;

audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

audio.startRecording();

Thread thread = new Thread(new Runnable() {
public void run() {
readAudioBuffer();
}
});

thread.setPriority(Thread.currentThread().getThreadGroup().getMaxPriority());

thread.start();

handler.removeCallbacks(update);
handler.postDelayed(update, 25);

} else if (audio != null) {
audio.stop();
audio.release();
audio = null;
handler.removeCallbacks(update);
}

}
});
}

private void readAudioBuffer() {

try {
short[] buffer = new short[bufferSize];

int bufferReadResult;

do {

bufferReadResult = audio.read(buffer, 0, bufferSize);

for (int i = 0; i < bufferReadResult; i++){

if (buffer[i] > lastLevel) {
lastLevel = buffer[i];
}

}

} while (bufferReadResult > 0 && audio.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING);

if (audio != null) {
audio.release();
audio = null;
handler.removeCallbacks(update);

}

} catch (Exception e) {
e.printStackTrace();
}

}

private Runnable update = new Runnable() {

public void run() {

SoundLevel.this.level.setProgress(lastLevel);

lastLevel *= .5;

handler.postAtTime(this, SystemClock.uptimeMillis() + 500);

}

};
}

关于android - 我想检查android中的声音响度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8401455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com