分贝测试

news/2024/11/6 13:40:19/

此demo涉及到麦克风  动画 以及线程的使用:

开启麦克风录制声音:

  为实现分贝测试, 需要对周围声音进行录制, 新建MicActivity 类, 使用MediaRecorder(视频/ 音频 录制类)来气麦克风录制音频, 并使用File 创建文件将音频保存到手机, 使用AnimationDrawable 用于显示录音的动画效果:

public class MicActivity extends AppCompatActivity {private MediaRecorder mediaRecorder;  //麦克风private File mAudiofile, mSampleDir;  //录音文件保存private ImageView iv_wave_left,iv_wave_right;  //声音动画图片private AnimationDrawable ad_left, ad_right; //左右动画属性@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_mic);getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  //保持屏幕不暗initView();}private void initView() {iv_wave_left = (ImageView) findViewById(R.id.iv_record_wave_left);iv_wave_right = (ImageView) findViewById(R.id.iv_record_wave_right);ad_left = (AnimationDrawable) iv_wave_left.getBackground();  //动画效果ad_right = (AnimationDrawable) iv_wave_right.getBackground();ad_left.start();ad_right.start();  //开启动画}@Overrideprotected void onStart() {super.onStart();mediaRecorder = new MediaRecorder();mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  //姻缘为麦克风mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);  //音频文件的编码mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  //设置audio的格式try {mSampleDir = Environment.getExternalStorageDirectory();  //获取手机内存路径//用IM+ 系统当前时间为文件名建立 .amr的文件, 文件路径为mSampleDirmAudiofile = File.createTempFile("IM" + System.currentTimeMillis(), ".arm", mSampleDir);}catch (IOException e){e.printStackTrace();}mediaRecorder.setOutputFile(mAudiofile.getAbsolutePath());   //设置声音输出文件的路径try {mediaRecorder.prepare();   //准备录制}catch (Exception e){e.printStackTrace();}mediaRecorder.start();      //开始录制}//返回功能public  void onBack(){MicActivity.this.finish();   //关闭当前页面}
}

将声音转换为分贝值:

 前面已经实现了声音的录制, 现在实现分贝的显示, 首先需要自定义Thread 使用该线程将麦克风录制的声音转换为分贝并显示出来。

class MicrophoneThread extends Thread{   //测量当前分贝值通知UI修改final  float minAngle = (float) Math.PI * 4 / 11;float angle;   //分贝值@Overridepublic void run() {while (true){angle = 100 * minAngle * mediaRecorder.getMaxAmplitude() / 32768;if (angle > 1000){angle = 100;}//构造方法的字符格式在这里如果不足两位,会补0DecimalFormat decimalFormat = new DecimalFormat("0.00");String p = decimalFormat.format(angle);   //format返回的是字符串, 分贝值try {Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}}}

设置全局对象:

private MicrophoneThread microphoneThread = new MicrophoneThread();  //线程用于实时录制环境声音

在onStart() 方法中加入

 microphoneThread.start();  //开启线程声音转换为分贝值

通过发送消息 实现更新页面:

 使用Handler 接收消息更新UI, 从而更新当前页面的分贝值。 需要对控件进行声明:

private TextView textView1;    //用于显示分贝值private MHandler mHandler = new MHandler();  //接收消息修改分贝值class MHandler extends Handler{@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 1:          //返回消息1textView1.setText(msg.obj.toString());  //修改分贝值break;}}}

初始化TextView, 用于显示当前分贝值, 在init() 中实例化:

textView1 = (TextView) findViewById(R.id.textView1); 

接着发送当前分贝值给Handler, 更新当前页面分贝值:

 在麦克风线程中添加代码:

String p = decimalFormat.format(angle);   //format返回的是字符串, 分贝值Message message = new Message();message.what = 1;message.obj = p;mHandler.sendMessage(message);  //发送当前分贝值

实现主界面向分贝测试仪界面跳转:

        textView = (TextView) findViewById(R.id.text);textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, MicActivity.class);startActivity(intent);}});}








http://www.ppmy.cn/news/442365.html

相关文章

音频分贝的计算

16位二进制数的最小值是0000000000000000,最大值是1111111111111111,对应的十进制数就是0和65535,也就是最大和最小值之间的差值是65535,也就是说,它量化的模拟量的动态范围可以差65535,也就是96.32分贝&am…

分贝(db)的概念介绍

一、分贝的基本概念。 db是倍数的另一种表示方式。 分贝表示的意义是将一个很大数字表示缩小化。比如10000倍就是40db,方便铭记和计算。 二、运算方式 由此可见对数是求幂运算。分贝是建立在对数基础上。常见的db是以10为底的对数,因为日常数字10进制,方便计算。 功率量是1…

音量和分贝(一)

说明:本文引用了很多其他同仁所写的blog,并重新组织和加入了自己的一些说明 础知识: 对数运算(log、lg)的含义。 对数有两个要素组成:“底数”和“真数”,写作log (底数) (真数),底…

dB(分贝)的含义

看数据手册,看到0dB不知其义,遂搜索,得结果如下:留待参考 分贝(工程应用)  dB(Decibel,分贝) 是一个纯计数单位,本意是表示两个量的比值大小,没有单位。 在工程应用中经常看到貌似不同的定义方式(仅仅是看…

对分贝(dB)概念的理解

放大电路有四种模型:电压放大电路(对应电压增益Av);电流放大电路(对应电流增益Ai);互阻放大电路(对应互阻增益Ar);互导放大电路(对应互导增益Ag&a…

关于响度、响度级、声强、声强级、声压、声压级、分贝、方、电平、增益、音高、音分

在录音声学里,响度、响度级、声强、声强级、声压、声压级、分贝、方、电平、增益、音高、音分总是令人头疼的若干概念,这里简单的说一下他们的意义和区别,让我们把它们的顺序整理一下。分贝:分贝是声级测量中最常用的单位&#xf…

小米手机噪音测试软件,噪音分贝仪

应用介绍 分贝仪也被称为分贝仪(分贝计),测声计,噪声计,噪音检测器。 分贝仪是一款用手机麦克风来测量环境噪声分贝(dB)大小的噪声检测软件,测试时会有图表显示或分贝值情形供参考。 有了这款小工具,你就能够轻松的测量…

音量和分贝(三)

响度:听觉判断声音强弱的属性。 声音的强弱叫做响度。响度是人主观感觉判断的声音强弱,即声音响亮的程度,根据它可以把声音排成由轻到响的序列。响度是和频率有关的。是人的感受,低频的声强大和高频的低声强,人的感…