如何从Java中的SourceDataLine获取字节数组的音量

时间:2014-04-16 17:41:06

标签: java arrays audio byte volume

我已经编写了一个用于点对点语音聊天的Java程序,但是为了保持流量尽可能低,我想分析捕获的数据并使低容量的部分完全静音。 问题是,我不知道如何从字节数组中获取卷以及如何使部分静默。

1 个答案:

答案 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;
}