Android使用AudioRecord判断是否有音频输入

Android党都应该玩过一个叫吹裙子的游戏,这个游戏就是原理就是通过监听用户吹出的气的力度来决定如何把MM的裙子弄飞起来的,所以关键在于如何判断用户吹气的力度问题。现在公司刚好有这个需求要评估就是需要一直监听用户的语音输入,当在两秒内没有语音输入时候就暂停某项事情,有语音输入的时候就要继续做某件事。其实这两件事情的本质原理是一样的,就是通过这AudioRecord来处理用户输入的原始音频数据,从而计算出当前用户输入的音量大小来判断用户是否有语音输入。下面贴上一段代码用户可以自行研究。

public static int calculateVolume(byte[] var0, int var1) { int[] var3 = null; int var4 = var0.length; int var2; if(var1 == 8) { var3 = new int[var4]; for(var2 = 0; var2 < var4; ++var2) { var3[var2] = var0[var2]; } } else if(var1 == 16) { var3 = new int[var4 / 2]; for(var2 = 0; var2 < var4 / 2; ++var2) { byte var5 = var0[var2 * 2]; byte var6 = var0[var2 * 2 + 1]; int var13; if(var5 < 0) { var13 = var5 + 256; } else { var13 = var5; } short var7 = (short)(var13 + 0); if(var6 < 0) { var13 = var6 + 256; } else { var13 = var6; } var3[var2] = (short)(var7 + (var13 << 8)); } } int[] var8 = var3; if(var3 != null && var3.length != 0) { float var10 = 0.0F; for(int var11 = 0; var11 < var8.length; ++var11) { var10 += (float)(var8[var11] * var8[var11]); } var10 /= (float)var8.length; float var12 = 0.0F; for(var4 = 0; var4 < var8.length; ++var4) { var12 += (float)var8[var4]; } var12 /= (float)var8.length; var4 = (int)(Math.pow(2.0D, (double)(var1 - 1)) - 1.0D); double var14 = Math.sqrt((double)(var10 - var12 * var12)); int var9; if((var9 = (int)(10.0D * Math.log10(var14 * 10.0D * Math.sqrt(2.0D) / (double)var4 + 1.0D))) < 0) { var9 = 0; } if(var9 > 10) { var9 = 10; } return var9; } else { return 0; } }

上述方法的形参中的一个字节数组便是当前捕捉到用户输入的原始音频数据,第二个形参则是音频数据格式位PCM,16位每个样本,比如如果音频数据格式设为AudioFormat.ENCODING_PCM_16BIT,则参数传16。最后实现的效果就是如下:

01-12 18:54:17.222 E/recordtest(24249): no voice input
…………….
01-12 18:54:19.027 E/recordtest(24249): no voice input
01-12 18:54:19.067 E/recordtest(24249): no voice input
01-12 18:54:19.105 E/recordtest(24249): no voice input
01-12 18:54:19.145 E/recordtest(24249): no voice input
01-12 18:54:19.188 E/recordtest(24249): no voice input
01-12 18:54:19.227 E/recordtest(24249): no voice input
01-12 18:54:19.228 E/recordtest(24249): no voice input in 2 sec
01-12 18:54:19.269 E/recordtest(24249): no voice input
01-12 18:54:19.306 E/recordtest(24249): no voice input
01-12 18:54:19.345 E/recordtest(24249): no voice input
01-12 18:54:19.387 E/recordtest(24249): no voice input
01-12 18:54:19.427 E/recordtest(24249): no voice input
01-12 18:54:19.466 E/recordtest(24249): has voice input
01-12 18:54:19.505 E/recordtest(24249): has voice input
01-12 18:54:19.546 E/recordtest(24249): has voice input
01-12 18:54:19.586 E/recordtest(24249): has voice input
01-12 18:54:19.646 E/recordtest(24249): has voice input
01-12 18:54:19.686 E/recordtest(24249): has voice input
01-12 18:54:19.726 E/recordtest(24249): has voice input
01-12 18:54:19.766 E/recordtest(24249): has voice input

以上所述是小编给大家介绍的Android使用AudioRecord判断是否有音频输入,多条目的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-09-24 12:01:22

Android使用AudioRecord判断是否有音频输入的相关文章

Android录音--AudioRecord、MediaRecorder的使用

Android提供了两个API用于实现录音功能:android.media.AudioRecord.android.media.MediaRecorder. 网上有很多谈论这两个类的资料.现在大致总结下: 1.AudioRecord 主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫.语音) 优点:语音的实时处理,可以用代码实现各种音频的封装 缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码

android 蓝牙耳机MIC音频输入

问题描述 android 蓝牙耳机MIC音频输入 10C 已经将android和蓝牙耳机通过Headset协议连接上,但是耳机的MIC总是获取不到音频输入求大神指点 ... 解决方案 下面的编码,以在Android中启动语音识别:PackageManager pm = getPackageManager();List activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)

Android实现音频条形图效果(仿音频动画无监听音频输入)

音频条形图 如下图所示就是这次的音频条形图: 由于只是自定义View的用法,我们就不去真实地监听音频输入了,随机模拟一些数字即可. 如果要实现一个如上图的静态音频条形图,相信大家应该可以很快找到思路,也就是绘制一个个的矩形,每个矩形之间稍微偏移一点距离即可.如下代码就展示了一种计算坐标的方法. for (int i = 0; i < mRectCount; i++) { // 矩形的绘制是从左边开始到上.右.下边(左右边距离左边画布边界的距离,上下边距离上边画布边界的距离) canvas.dra

利用Android平台录音,得到的音频严重失真

问题描述 利用Android平台录音,得到的音频严重失真 最近在做Android开发录音方面的开发,利用mediarecord录取声音,得到的音频严重失真,几乎听不出声音的内容,但从声音可以确定的是,这个声音确实是刚才录进去的.开始以为是采样率方面出错,但从打印信息看到,audio系统获取的采样率是8000,通道数是1,调用编码器时识别的采样率也是8000,通道数也是1.现在很迷糊,不知道什么原因导致系统录音失真,请大神帮我定位一下问题. 解决方案 你试试我这段代码看能不能录,public st

audiorecord-求救!!!!!Android 使用AudioRecord录音不正常

问题描述 求救!!!!!Android 使用AudioRecord录音不正常 package com.example.testmediarecorder; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException; import android.app.Activ

Android编程开发之EditText中不输入特定字符会显示相关提示信息的方法

本文实例讲述了Android编程开发之EditText中不输入特定字符会显示相关提示信息的方法.分享给大家供大家参考,具体如下: 先看效果图: 源码如下: 布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="

音频输入尚未激活无法录制音频怎么办?

  一.首先点"确定"关掉它,然后进入Adobe Audition的主界面. 二.然后点Adobe Audition界面菜单中的"编辑",在弹出的菜单中,选"音频硬件设备",如下图所示. 三.在弹出的"音频硬件设置"对话框单击"控制面板",如图所示. 四.在这里需要勾选DirectSound输入端口里的设备,然后单击"确定",如图所示. 五.最高再依次点确定关闭所有对话框,然后重新打开A

c++ mfc-MFC中如何判断编辑框中输入的数值是double类型的

问题描述 MFC中如何判断编辑框中输入的数值是double类型的 MFC中如何判断编辑框中输入的数值是double类型的,用了typeid,if(typeid(m_test) == typeid(double)){......},发现没用呀 ,求大神告知方法,不胜感激 解决方案 你获取编辑框的值都是字符串类型的.那问题就是判断字符串了

RegularExpressionValidator 判断输入框 txtZumenmeisyo 的输入是否超过指定长度,正则表达是该怎么写

问题描述 <asp:RegularExpressionValidatorID="RegularExpressionValidator1"ControlToValidate="txtZumenmeisyo"ErrorMessage="1"runat="server"ValidationExpression="[wW]{2,}"></asp:RegularExpressionValidator