-
Notifications
You must be signed in to change notification settings - Fork 2
/
AudioIntervalChecker.java
182 lines (167 loc) · 4.91 KB
/
AudioIntervalChecker.java
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
package com.xter.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author XTER
* 项目名称: TechBasis
* 创建时间: 2020/8/5
* 描述:检测一段音频的无输入时间段是否超过某个阈值
*/
public class AudioIntervalChecker {
private int mSilentSeconds;
private static final int MAX_SECONDS = 5;
/**
* 48k采样率,位深16bit,单声道,录60秒的数据大小
*/
private static final int MAX_SIZE = 48 * 1024 * 60 * 2;
/**
* 16kl采样率,位深16bit,单声道,录10秒的数据大小
*/
private static final int MIN_SIZE = 16 * 1024 * 10 * 2;
private ByteBuffer mByteBuffer;
private static class Holder {
private static AudioIntervalChecker INSTANCE = new AudioIntervalChecker();
}
public static AudioIntervalChecker getInstance() {
return Holder.INSTANCE;
}
private AudioIntervalChecker() {
mByteBuffer = ByteBuffer.allocate(MAX_SIZE);
}
public static void main(String[] args) {
// File file = new File("E:\\studying\\log\\bbb.pcm");
File file = new File("E:\\studying\\test\\1234.m4a");
try {
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[24*1024];
while (fis.read(buffer) != -1) {
// System.out.println(AudioIntervalChecker.getInstance().calculateVolume(buffer, 16));
System.out.println(AudioIntervalChecker.getInstance().checkSegment(buffer, 12000, 1, 16, 5));
}
// System.out.println(Arrays.toString(buffer));
// System.out.println(AudioIntervalChecker.getInstance().checkEntire(buffer, 44100, 1, 16, MAX_SECONDS));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 累积数据,检查累积的数据是否可视为录入完成
*
* @param data 音频数据
* @param rate 采样率
* @param channelNum 声道数
* @param bit 位深
* @param maxDelay 最大无输入时间
* @return 是否视为录入完成
*/
public synchronized boolean checkSegment(byte[] data, int rate, int channelNum, int bit, int maxDelay) {
mByteBuffer.put(data);
mByteBuffer.flip();
// mByteBuffer.mark();
int size = mByteBuffer.remaining();
System.out.println("size:"+size);
byte[] buffer = new byte[size];
mByteBuffer.get(buffer);
boolean should = checkEntire(buffer, rate, channelNum, bit, maxDelay);
if (!should) {
mByteBuffer.limit(mByteBuffer.capacity());
mByteBuffer.position(size);
}
return should;
}
/**
* 检查整段音频,若超出一定时间音频无输入,则视为已经录入完成
*
* @param data 音频数据
* @param rate 采样率
* @param channelNum 声道数
* @param bit 位深
* @param maxDelay 最大无输入时间
* @return 是否视为录入完成
*/
public synchronized boolean checkEntire(byte[] data, int rate, int channelNum, int bit, int maxDelay) {
ByteBuffer byteBuffer = ByteBuffer.wrap(data);
int bufferSize = rate * channelNum * bit / 8;
if (bufferSize * maxDelay > data.length) {
return false;
}
byte[] buffer = new byte[bufferSize];
byteBuffer.get(buffer);
if (calculateVolume(buffer, bit) == 0) {
mSilentSeconds++;
if (mSilentSeconds >= maxDelay) {
mSilentSeconds = 0;
return true;
}
} else {
mSilentSeconds = 0;
}
return false;
}
private int calculateVolume(byte[] data, int bit) {
int[] var3 = null;
int var4 = data.length;
int var2;
if (bit == 8) {
var3 = new int[var4];
for (var2 = 0; var2 < var4; ++var2) {
var3[var2] = data[var2];
}
} else if (bit == 16) {
var3 = new int[var4 / 2];
for (var2 = 0; var2 < var4 / 2; ++var2) {
byte var5 = data[var2 * 2];
byte var6 = data[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) (bit - 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;
}
System.out.println(var9);
return var9;
} else {
System.out.println("0");
return 0;
}
}
}