我已经编写了一个用于点对点语音聊天的Java程序,但是为了保持流量尽可能低,我想分析捕获的数据并使低容量的部分完全静音。 问题是,我不知道如何从字节数组中获取卷以及如何使部分静默。
答案 0 :(得分:2)
您必须在数据上滑动时间窗口(比如说.25秒的数据)并计算均方根以查看该时间段是否为静音。究竟有多少字节构成.25秒取决于样本的音频速率。
假设你有byte [] audioData中的数据,并且音频数据是8位PCM数据的签名,你可以像下面那样计算RMS ......然后使用像1000这样的值作为你的静音阈值
/** Computes the RMS volume of a group of signal sizes */
public double volumeRMS(int start, int length) {
long sum = 0;
int end = start + length;
int len = length;
if (end > audioData.length) {
end = audioData.length;
len = end - start;
}
if (len == 0) {
return 0;
}
for (int i=start; i<end; i++) {
sum += audioData[i];
}
double average = (double)sum/len;
double sumMeanSquare = 0;;
for (int i=start; i<end; i++) {
double f = audioData[i] - average;
sumMeanSquare += f * f;
}
double averageMeanSquare = sumMeanSquare/len;
double rootMeanSquare = Math.sqrt(averageMeanSquare);
return rootMeanSquare;
}