移动互联网开发教学案例学习-4

2021SC@SDUSC


目录

案例——Flappybird

声控版本

synchronized 基本用法

AudioRecord.getMinBufferSize()方法:

重写run()函数

通过分贝大小调整鸟的高度


案例——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.classFoo.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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值