[英]How to get the volume of a byte array from a SourceDataLine in Java
我已经编写了一个Java程序用于点对点语音聊天,但是为了保持尽可能低的通信量,我想分析捕获的数据并使低音量的部分完全静音。 问题是,我不知道如何从字节数组中获取音量以及如何使部分静音。
您必须在数据上滑动一个时间窗口(例如价值0.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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.