Android话筒音频采样和使用
“jamesjoice”通过精心收集,向本站投稿了7篇Android话筒音频采样和使用,下面是小编给大家带来关于Android话筒音频采样和使用,一起来看看吧,希望对您有所帮助。
篇1:Android话筒音频采样和使用
Android手机话筒采样有部分代码是在网上找的,具体不记得了,
使用采样结果以及是自己的app的功能代码:
1. 在一部分app中会需要对话筒的音频输入获取使用,比如之前很火的吹裙子;
2. 采样线程:
public class MicroLevelRunnable implements Runnable {
private static final String tag = “MicroLevelThread”;
private AudioRecord ar;
private short bs;
// 11 025 Hz、8 bit的声音称为电话音质;
// 22 050 Hz、16 bit的声音称为广播音质;
// 44 100 Hz、16 bit已达到CD的音质了[4]。
private final int SAMPLE_RATE_IN_HZ = 22050;
private boolean isRun = false;
public static final int msg_v = 0;
public static final int msg_vv = 1;
public static final int msg_vf = 2;
public static final int msg_vo = 3;
public static final int page_need_water = 10;
public static int bubble_speed = 2;// 每N次调用,出一个bubble
public MicroLevelRunnable {
super();
}
public void stop(){
isRun = false;
ar.stop();
ar.release();
ar = null;
}
public void run() {
bs = (short)AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
ar = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, bs);
// 用于读取的
ar.startRecording();
short[] buffer = new short[bs];
isRun = true;
int speed = 1;
while (true) {
if (!isRun) {
try {
synchronized (this) {
Log.v(tag, “wait..”);
this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
speed++;
int r = ar.read(buffer, 0, bs);
int v = 0;
for (int i = 0; i< buffer.length; i++) {
v += buffer[i] * buffer[i];
}
int value = (int) (Math.abs((int) (v / (float) r) / 10000) >>1);
double dB = 10 * Math.log10(Math.abs(v) / (double) r);
Message msg = new Message();
msg.what = msg_v;
msg.arg1 = value;
msg.arg2 = (int) dB;
// -------------------------------------------
// 用以下方法区分是否是吹气,缺点是可以模拟
// DB白噪低于50为噪音,大于60为无效
// value值低于38为无声,大于60无无效
if (speed >bubble_speed) {
BubbleMain.MainHandle.sendMessage(msg);
speed = 1;
}
}
}
}
3. 启动采样线程:
mRunnable = new MicroLevelRunnable();
mThread = new Thread(mRunnable);
mThread.start();
4. 本人的android应用【openbox.mobilem.360.cn/index/d/sid/341284 zhushou.360.cn/detail/index/soft_id/341284】 吹泡泡中就使用了如上功能模块
该应用是web+android组件的典型应用,吹泡泡的展现是优化修改过的web程序,通过webview接口以及话筒采样线程的结合,实现在手机上吹出泡泡的效果:
篇2:演讲时如何正确使用话筒
当前会议发言话筒的配置常见的有三种方式:
1.会议话筒+调音台;
2.会议话筒+智能混音器或会议话筒+数字媒体矩阵;
3.手拉手式数字会议话筒。
关于这三种配置方式的应用场合以及优缺点,做个简单比较,以便在实际工程配置时根据现场功能需要做到心中有底:
“会议话筒+调音台”方式
主要应用在对音质要求较高的场合。具有音色还原相对较好的优点,但是这种方式话筒的数量不宜过多,一般150平方左右,配置四只话筒为宜,并且须顾及现场的建声环境以及话筒、音箱的摆位。如果会议话筒数量增多,啸叫的问题在所难免,通过处理设备来解决的话,不但牺牲了音质,传声增益也提不起来。这样,就把这种配置方式的优点也给变成了缺点。其次,这种配置方式如果加上处理器来抵制啸叫,总体的造价就增加,性价比没有另外两种方式高;再次,作为最传统的会议发言方式,其功能不能进行扩展,比如会议智能化管理、摄像跟踪,同声传译等功能。这种方式目前仍然有实际应用,主要是用于报告厅、培训厅等场所。
“会议话筒+智能混音器或会议话筒+音频处理器”方式
会议话筒+智能混音器主要是应用在话筒的数量较多(四只以上)、工程造价又不太高的场合;会议话筒+数字媒体矩阵主要是应用在话筒的.数量较多(四只以上)、工程造价比较高的场合。优点在于一定程度上抑制了啸叫,同时可以对会议现场的话筒进行一定的智能管理,通过中控或摄像跟踪处理可以实现摄像跟踪功能,但缺点也是显而易见的,首先每个话筒要
一根话筒线,话筒数量越多,需要布的线越多,施工调试工作量很大;其次传声增益虽有一定的提升,但通常十几只话筒共用的效果还是不太理想;再次虽然实现了会议现场的智能管理,但要拓展其它会议现场的功能需求,尚需要借助其它功能设备来实现,性价比并不是太高。这种方式主要应用在人数不是很多的视频会议、音视频信号需要记录的小型会议室、较大型互动培训室、接见厅等场所。
“手拉手式数字会议话筒”方式
主要应用在话筒数量多,从数只会议话筒的小型会议到几千只会议话筒的大型会议;可以实现从单一的语音发言到多语种的语音发言;可以对会议现场通过硬件本身设置或管理软件设置,对会议进行有效的管理,还可以拓展签到、投票表决、嵌入式安装等功能需要。其优点在于会议综合功能需要可以满足,能保证对会议的效果做到有效控制;布线方便,一条专用数字会议话筒线可以连接几十只话筒;控制方式灵活;可拓展性强,性价比很高。尽管单只话筒的音质没有第一种方式好,但在使用相同的话筒数量前提下,总体效果则比第一种方式要好。这种方式已经广泛应用于各种类型的会议场所,成为会议发言的主流配置。
拿话筒的正确姿势
1.手不要完全握住麦克风的最上面,也不要只拿麦克风最下面一点点。正确的拿法要在麦克风下方的四分之一处,这样的拿法是最标准的。
2.嘴巴不要离麦克风太近。有些朋友唱歌喜欢离麦克风很近,感觉这样声音会大些,效果会好些,这种想法是错误的。这反而会影响到麦克风的收音,效果会更差。
3.也有些朋友唱歌喜欢离麦克风很远,感觉很有范,结果往往会导致声音很小,有的时候甚至听不到他唱歌的声音。正确的距离是,麦克风距离嘴巴大概两根手指的宽度,这个距离是最适合的,不远也不会太近。这样唱出来的歌声也是最好听的。
4.麦克风不要一直放在嘴巴面前。很多伙伴唱歌,在歌曲的间奏时,也喜欢把麦克风放在嘴巴跟前,这样其实是很容易开口唱的时候,跟错拍子的。正确的做法时,歌曲间奏时,把麦克风放下来,等下一句快开始的时候,再拿起来,这样等你刚好拿起来就开唱,就很容易跟到拍子。
篇3:演讲时如何正确使用话筒
麦克风比较好是放置在话筒架上,话简架上的麦克风可以上下移动、前后娜动,使用起来很方便,更主要的是可以空出双手来做动作,使演讲者的形象保持一个完美的整体。
麦克风与嘴的距离一般在一拳左右,太近了气粗声大,容易产生喷话筒的情况,一些送气音节(如怕、他、可、去、其等)更是明显,要注意把握好;话简也不能太远,太远了声音传不出去,尤其是敏感度不高的话筒,太远了等于没用。
麦克风不要放在嘴与地面平行的直线上,应低于嘴唇,放在嘴的下部且与嘴成45°角,这样才能灵活运用,否则会出现抬头时被话简拦住脸部的情况。
调好麦克风的位置后,不要用手去敲,看有没有声音,也不要用嘴吹,这些动作很不雅观。可检查麦克风的开关是否开了,麦克风的开关向上是开,向下是关,这是国际统一的。
有时可能没有话筒架,那么麦克风只能拿在手里了,握麦克风时不要太紧,握得太紧手容易颇动,会使听众以为你很紧张。可以握成拳状,也可握成抓状,但一般采用前者。不要随意换手,如果要换,一定要配合好动作进行。
演讲者根据场地的大小和麦克风的性能以及听众情绪的静噪情况,可以灵活调整嘴与麦克风的距离。场地大,尤其是在室外,或者麦克风性能差、听众浮躁不安、人群中有声音时,可以近点,否则应远点。
篇4:android sqlite 使用
Android操作系统使用SQLite数据库,使用有两种方法获得数据库对象:
1.获取已经存在的数据库
?
1
SQLiteDatabase dbbrndi=SQLiteDatabase.openDatabase(“/sdcard/zhycheng.db3”, null,SQLiteDatabase.OPEN_READONLY);
第一个String参数是数据库在文件系统中的位置,第二个参数一般为null,第三个参数控制数据库打开的方式,
这样就获得了数据库对象。
2.自己创建数据库
新建一个类,继承SQLiteOpenHelper,添加未实现的方法
代码如下
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package your.zhycheng;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class MyHelper extends SQLiteOpenHelper{
public MyHelper(Context context, String name)
{
this(context,name,1);
}
public MyHelper(Context context, String name,int version)
{
this(context,name,null,version);
}
public MyHelper(Context context, String name,//数据库的名字
CursorFactory factory,
int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“create table user(id int,name text)”);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
获得的数据库位于/data/data/yourpackage/databases/zhycheng.db3
然后通过生成一个MyHelper类的对象,调用
?
1
2
3
MyHelper mh=new MyHelper(this,“zhycheng”);
SQLiteDatabase db=mh.getReadableDatabase;
SQLiteDatabase db=mh.getWritableDatabase();
分别获得只读和可写的数据库,
获得数据库之后就可以进行数据库操作有以下两种方式操作数据库
1.执行SQL语句
?
1
2
3
db.rawQuery(sql,Args)
db.execSQL(sql, Args)
db.execSQL(sql)
上面的sql是String类型的数据库语言,Args是String数组。前面String中若有“?”则对应后面的值。
篇5:Android中AsyncTask使用
一、AsyncTask的作用:
代替Thread+Handler的组合,使创建异步任务变得简单,
AsyncTask执行后台操作,并在用户界面上发布结果,而不必处理线程。
二、AsyncTask的定义:
public abstract class AsyncTask
extends Object
AsyncTask必须子类可以使用。子类将覆盖至少一个方法(doInBackground执行异步任务),通常会覆盖一次(onPostExecute显示结果,更新UI)
AsyncTask三种类型如下:
》Params,参数的类型发送到任务执行时。
》Progress,在后台计算过程中公布的进度单元类型。
》Result,计算结果的类型。
不是所有类型都是异步任务所使用的。要标记为未使用的类型,设置该类型Void:
三、AsyncTask的方法:
1、onPreExecute()
在任务开始后立即调用,在UI线程执行。这一步通常用于设置任务,例如在用户界面中初始化进度条。
2、doInBackground(Params...)
后台线程调用onPreExecute()完成后立即执行。这一步后台进程执行,可能会花费很长时间。
3、onProgressUpdate(Progress...)
调用publishProgress,在UI线程上执行,
这种方法是用来显示用户进度界面,后台进程仍在执行。例如,它可用于显示一个进度条或在文本中显示日志。
4、onPostExecute(Result)
后台进程处理完后,在UI线程上执行。后台进程的结果被传递到这一步作为参数。
常用的写法如下:
class MyTask extends AsyncTask new MyTask().execute();//执行任务 三、AsyncTask的规则: 1、任务实例必须在用户界面线程中创建。 2、execute(Params... params)方法必须在UI线程中调用。 3、不要手动调用onPreExecute,doInBackground,onProgressUpdate,onPostExecute这些方法 4、一个任务实例只能执行一次,如果执行第二次将会抛出异常 今天使用到shape,这个里面有很多属性,在这里我记录一下各个属性的使用的情况以及所代表的意思 复制代码 xmlns:android=“schemas.android.com/apk/res/android” android:shape=[“rectangle” | “oval” | “line” | “ring”] > android:radius=“integer” android:topLeftRadius=“integer” android:topRightRadius=“integer” android:bottomLeftRadius=“integer” android:bottomRightRadius=“integer” /> android:angle=“integer” android:centerX=“integer” android:centerY=“integer” android:centerColor=“integer” android:endColor=“color” android:gradientRadius=“integer” android:startColor=“color” android:type=[“linear” | “radial” | “sweep”] android:useLevel=[“true” | “false”] /> android:left=“integer” android:top=“integer” android:right=“integer” android:bottom=“integer” /> android:width=“integer” android:height=“integer” /> android:color=“color” /> android:width=“integer” android:color=“color” android:dashWidth=“integer” android:dashGap=“integer” /> 复制代码 上面这段就是shape使用的格式,来看一下如何使用: 定义这是一个GradientDrawable,必须作为根元素, android:shape 定义shape的值,必须是下面的之一: “rectangle” 矩阵,这也是默认的shape “oval” 椭圆 “line” 一条水平的直线。这种shape必须使用 “ring” 圆环 下面的属性只有当 android:shape=“ring”才使用: android:innerRadius 尺寸。 内环的半径。一个尺寸值(dip等等)或者一个尺寸资源。 android:innerRadiusRatio Float类型。这个值表示内部环的比例,例如,如果android:innerRadiusRatio = “ 5 ”,那么内部的半径等于环的宽度除以5。这个值会被android:innerRadius重写。 默认值是9。 android:thickness 尺寸。环的厚度,是一个尺寸值或尺寸的资源。 android:thicknessRatio Float类型。厚度的比例。例如,如果android:thicknessRatio= “ 2 ”,然后厚度等于环的宽度除以2。这个值是被android:innerRadius重写, 默认值是3。 android:useLevel Boolean类型。如果用在 LevelListDrawable里,那么就是true。如果通常不出现则为false。 为Shape创建一个圆角,只有shape是rectangle时候才使用。 android:radius Dimension。圆角的半径。会被下面每个特定的圆角属性重写。 android:topLeftRadius Dimension。top-left 设置左上角的半径 android:topRightRadius Dimension。top-right 设置右上角的半径 android:bottomLeftRadius Dimension。 设置右下角的半径 android:bottomRightRadius Dimension。设置左下角的半径 指定这个shape的渐变颜色。 android:angle Integer。渐变的角度。 0 代表从 left 到 right。90 代表bottom到 top。必须是45的倍数,默认为0 android:centerX Float。渐变中心的相对X坐标,在0到1.0之间。 android:centerY Float。渐变中心的相对Y坐标,在0到1.0之间。 android:centerColor Color。可选的颜色值。基于startColor和endColor之间。 android:endColor Color。 结束的颜色。 android:gradientRadius Float 。渐变的半径。只有在 android:type=“radial”才使用 android:startColor Color。开始的颜色值。 android:type Keyword。渐变的模式,下面值之一: “linear” 线形渐变, 这也是默认的模式 “radial” 辐射渐变。startColor即辐射中心的颜色 “sweep” 扫描线渐变。 android:useLevel Boolean。如果在LevelListDrawable中使用,则为true 内容与视图边界的距离 android:left Dimension。左边填充距离. android:top Dimension。顶部填充距离. android:right Dimension。右边填充距离. android:bottom Dimension。底部填充距离. 这个shape的大小。 android:height Dimension。这个shape的高度。 android:width Dimension。这个shape的宽度。 注意:默认情况下,这个shape会缩放到与他所在容器大小成正比。当你在一个ImageView中使用这个shape,你可以使用 android:scaleType=“center”来限制这种缩放。 填充这个shape的纯色 android:color Color。颜色值,十六进制数,或者一个Color资源 这个shape使用的笔画,当android:shape=“line”的时候,必须设置改元素。 android:width Dimension。笔画的粗细。 android:color Color。笔画的颜色 android:dashGap Dimension。每画一条线就间隔多少。只有当android:dashWidth也设置了才有效。 android:dashWidth Dimension。每画一条线的长度。只有当 android:dashGap也设置了才有效。 android:dashGap和android:dashWidth设置这条线为虚线的,其中android:dashWidth表示'-'这样一个横线的宽度,android:dashGap表示之间隔开的距离, 使用别人的一段代码: button_bg.xml 复制代码 android:width=“2dp” android:color=“#fad3cf” /> android:bottomLeftRadius=“5dp” android:bottomRightRadius=“5dp” android:topLeftRadius=“5dp” android:topRightRadius=“5dp” /> android:bottom=“10dp” android:left=“10dp” android:right=“10dp” android:top=“10dp” /> 复制代码 button_pressed_bg.xml的内容如下: 复制代码 android:endColor=“#FFFFFF” android:gradientRadius=“50” android:startColor=“#ff8c00” android:type=“radial” /> android:dashGap=“3dp” android:dashWidth=“5dp” android:width=“2dp” android:color=“#dcdcdc” /> android:bottom=“10dp” android:left=“10dp” android:right=“10dp” android:top=“10dp” /> 复制代码 如何使用,看下面的代码: 复制代码 复制代码 Android的闹钟实现机制很简单, 只需要调用AlarmManager.Set()方法将闹钟设置提交给系统,当闹钟时间到后,系统会按照我们的设定发送指定的广播消息,我们写一个广播去接收消息做相应处理即可, 第一步是设置闹钟: ? 1 private static String MY_ALARM_ACTION = “android.alarm.test.action”; ? 1 2 3 4 5 6 7 8 9 10 11 12 /** * 设置闹钟 * @param context * @param firstTriggerTimeMillis 首次触发时间 (单位毫秒) * @param periodTimeMillis 间隔时间 */ private void setAlarmTime(Context context, long firstTriggerTimeMillis, long periodTimeMillis) { AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(MY_ALARM_ACTION); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstTriggerTimeMillis, periodTimeMillis, sender); } 第二步是写一个接口器接收事件广播: ? 1 2 3 4 5 6 7 8 9 /** * 闹钟接收 * @author Antony * @date 2014-7-23 */ public static class MyAlarmReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (MY_ALARM_ACTION.equals(intent.getAction())) { Logcat.e(“接收一次闹钟消息!”); ? 1 2 3 4 5 //TODO 在这里写相关处理 return; } } } 当然Receiver是需要在Mainfest.xml中注册的,我的注册信息如下: ? 1 2 3 4 5 细心的可能会发现我的MyAlarmReceiver类是带static关键词的,还有我在注册广播时是加了“$”符号的, 原因是酱紫的,为了代码不至于看起来那么凌乱,接收器是作为MyTest的内部类来写的。如果BroadcastReceiver做为内部类来写在Manifest中是不能直接用形如下面的方式来注册的: 【Android话筒音频采样和使用】相关文章: 1.android Actionbar 上的 MenuItem 的 使用细节和优化 2.经典童话故事音频 3.话筒作文400字 4.金色话筒作文篇6:android shape使用总结
篇7:android AlarmManager的使用






文档为doc格式