2021SC@SDUSC
目录
AudioRecord.getMinBufferSize()方法:
案例——Flappybird
声控版本
是通过获取分贝,根据分贝的大小来设置鸟的高度。
synchronized 基本用法
synchronized
加锁时,使用的是对象的内置锁(intrinsic lock),任何 Java 对象都拥有这个锁,所以任何 Java 对象都可以用来给 synchronized
执行同步。synchronized
语句使用的对象由我们显式指定,synchronized
方法则用的是方法所属的那个对象的内置锁。
synchronized (mLock) {
// Put your stuff here
}
静态方法不属于任何对象,那静态的 synchronized
方法又用的是哪个锁呢?任何 Java 对象都可以用来给 synchronized
执行同步。虽然静态方法不关联对象,但是,他却属于所在的那个类实例。
class Foo {
public static synchronized void foo() {}
}
这里的 foo()
属于 class Foo
。我们又知道,Java 里,class Foo
对应着这样一个类实例 Foo.class
。Foo.class
也是一个对象,所以他能够被用来加锁。静态的同步方法,就是使用对应的类实例来进行加锁的。
AudioRecord.getMinBufferSize()方法:
static final int BUFFER_SIZE= AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_DEFAULT,AudioFormat.ENCODING_PCM_16BIT);
(1)函数原型:
public static int getMinBufferSize (int sampleRateInHz, int channelConfig, int audioFormat)
(2)作用:返回成功创建AudioRecord对象所需要的最小缓冲区大小
(3)参数:
sampleRateInHz:默认采样率,单位Hz,这里设置为44100,44100Hz是当前唯一能保证在所有设备上工作的采样率;
channelConfig: 描述音频声道设置,这里设置为AudioFormat.CHANNEL_CONFIGURATION_MONO,CHANNEL_CONFIGURATION_MONO保证能在所有设备上工作;
audioFormat:音频数据的采样精度,这里设置为AudioFormat.ENCODING_16BIT;
(4)返回值:
返回成功创建AudioRecord对象所需要的最小缓冲区大小。 注意:这个大小并不保证在负荷下的流畅录制,应根据预期的频率来选择更高的值,AudioRecord实例在推送新数据时使用此值
如果硬件不支持录制参数,或输入了一个无效的参数,则返回ERROR_BAD_VALUE(-2),如果硬件查询到输出属性没有实现,或最小缓冲区用byte表示,则返回ERROR(-1)。
重写run()函数
int r=mAudioRecord.read(buffer,0,BUFFER_SIZE);
r是实际读取数据的长度 。
for (int i=0;i<buffer.length;i++){
v+=buffer[i]*buffer[i];
}
将buffer内容取出,进行平方和运算。
double mean=v/(double)r;
double volume=10*Math.log10(mean);
mvolume=(int)volume;
Log.d(TAG,"分贝值"+volume);
平方和除以数据总长度,得到音量大小。
通过分贝大小调整鸟的高度
分贝大,上升距离大;分贝小,上升距离小。
处理鸟的高度:
int volume=audioRecordDemo.getMvolume();
bird.setY(bird.getY()-(volume-40)+mTmpBirdDis);