Android录音声音大小判断,Android录音使用 byte 类型获取分贝或声音振幅

以下是获取声音振幅的代码:

try {

while (isRecording) {

read = audioRecord.read(data, 0, recBufSize);

// L.i(context, "开始获取音频TTT:" + data.length);

if (AudioRecord.ERROR_INVALID_OPERATION != read && retry <= 3) {

// L.i(context, "发出的音频TTT:" + data.length);

//录音成功,重置录音失败的次数

retry = 0;

int up = kaoLaRecordCore.upload(data, data.length); //TODO 算长度

long v = 0;

long tv = 0;

// 将 data 内容取出,进行平方和运算

for (int i = 0; i < data.length; i+=2) {

tv = data[i+1] * 128 + data[i];

tv *= tv;

v += tv;

}

// 平方和除以数据总长度,得到音量大小。

double mean = v / (double) read;

double volume = 10 * Math.log10(mean * 2);

KL.d(AudioThread.class, "分贝值:" + volume);

EventBus.getDefault().post((int)volume, ChatManager.TAG_VOICE_DB);

KL.d(AudioThread.class, "分贝值: {},v = {}, read = {}, mean = {} ", volume, v,

read, mean);

// L.i(context, "上传录音状态TTT:" + up);

// if (isTest) {

// try {

// os.write(data);

// } catch (Exception e) {

// e.printStackTrace();

// }

// }

} else {

L.i(AudioThread.class, "TTT录音权限可能有问题,暂时不能录音: read={}, retry:{}", read, retry);

if (retry <= 3) {

retry++;

} else {

isRecording = false;

EventBus.getDefault().post(context.getString(R.string.podcast_record_permission), TAG_MIC_FORBID_STATE);

break;

}

}

// L.i(context, "上次音频TTT:" + data.length);

Thread.sleep(10);

if (isRecording())

pauseThread();

}

// if (isTest) {

// try {

// os.close();

// } catch (IOException e) {

// e.printStackTrace();

// }

// }

} catch (Exception e) {

e.printStackTrace();

L.i(AudioThread.class, "上传出现异常");

}

效果是:

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

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66当前接受到的分贝值: %s,v =15

当前接受到的分贝值: %s,v =41

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =45

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =43

当前接受到的分贝值: %s,v =43

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =43

当前接受到的分贝值: %s,v =43

当前接受到的分贝值: %s,v =43

当前接受到的分贝值: %s,v =43

当前接受到的分贝值: %s,v =45

当前接受到的分贝值: %s,v =43

当前接受到的分贝值: %s,v =42

当前接受到的分贝值: %s,v =43

当前接受到的分贝值: %s,v =44

当前接受到的分贝值: %s,v =48

当前接受到的分贝值: %s,v =47

当前接受到的分贝值: %s,v =46

当前接受到的分贝值: %s,v =46

当前接受到的分贝值: %s,v =46

当前接受到的分贝值: %s,v =46

当前接受到的分贝值: %s,v =46

当前接受到的分贝值: %s,v =46

当前接受到的分贝值: %s,v =46

当前接受到的分贝值: %s,v =47

当前接受到的分贝值: %s,v =50

当前接受到的分贝值: %s,v =50

当前接受到的分贝值: %s,v =49

当前接受到的分贝值: %s,v =48

当前接受到的分贝值: %s,v =50

当前接受到的分贝值: %s,v =50

当前接受到的分贝值: %s,v =48

当前接受到的分贝值: %s,v =47

当前接受到的分贝值: %s,v =48

当前接受到的分贝值: %s,v =45

当前接受到的分贝值: %s,v =44

当前接受到的分贝值: %s,v =46

当前接受到的分贝值: %s,v =45

当前接受到的分贝值: %s,v =46

当前接受到的分贝值: %s,v =45

当前接受到的分贝值: %s,v =44

当前接受到的分贝值: %s,v =44

当前接受到的分贝值: %s,v =45

当前接受到的分贝值: %s,v =44

当前接受到的分贝值: %s,v =45

当前接受到的分贝值: %s,v =45

当前接受到的分贝值: %s,v =64

当前接受到的分贝值: %s,v =65

当前接受到的分贝值: %s,v =65

当前接受到的分贝值: %s,v =57

当前接受到的分贝值: %s,v =60

当前接受到的分贝值: %s,v =58

当前接受到的分贝值: %s,v =55

当前接受到的分贝值: %s,v =55

声音在0-100以内,基本声音维持在 40-60之间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Audio Framework 主要包括三个部分:AudioRecord、AudioTrack和MediaPlayer。其中,AudioRecord用于录制音频,AudioTrack用于播放音频,MediaPlayer则是用于同时实现音频的播放和录制。 录音的流程: 1. 创建 AudioRecord 对象,通过设置录音参数来初始化。 2. 调用 startRecording() 方法开始录制音频。 3. 不断调用 read() 方法读取录到的音频数据。 4. 将读取到的音频数据写入到 AudioFling 中。 5. 调用 stop() 方法停止录制并释放资源。 下面是具体的示例代码: ``` // 设置录音参数 int audioSource = MediaRecorder.AudioSource.MIC; int sampleRateInHz = 44100; int channelConfig = AudioFormat.CHANNEL_IN_MONO; int audioFormat = AudioFormat.ENCODING_PCM_16BIT; int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes); // 开始录制 audioRecord.startRecording(); // 读取音频数据 byte[] buffer = new byte[bufferSizeInBytes]; int readSize = audioRecord.read(buffer, 0, bufferSizeInBytes); // 写入 AudioFling AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes, AudioTrack.MODE_STREAM); audioTrack.play(); audioTrack.write(buffer, 0, readSize); // 停止录制 audioRecord.stop(); audioRecord.release(); ``` 以上代码仅为示例,实际使用时需要根据实际情况进行参数设置和错误处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值