Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中从SourceDataLine获取字节数组的卷_Java_Arrays_Audio_Byte_Volume - Fatal编程技术网

如何在Java中从SourceDataLine获取字节数组的卷

如何在Java中从SourceDataLine获取字节数组的卷,java,arrays,audio,byte,volume,Java,Arrays,Audio,Byte,Volume,我已经编写了一个用于点对点语音聊天的Java程序,但为了尽可能降低流量,我想分析捕获的数据,并使低音量部分完全静音。 问题是,我不知道如何从字节数组中获取卷,以及如何使部分保持静默。您必须在数据上滑动一个时间窗口(例如,25秒的数据),然后计算均方根,以查看该时间段是否静默。准确的字节数。25秒取决于样本的音频速率 因此,假设您有字节[]audioData中的数据,并且该音频数据是有符号的8位PCM数据,您将按如下方式计算RMS。。。然后使用像1000这样的值作为静音阈值 /** Compute

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

您必须在数据上滑动一个时间窗口(例如,25秒的数据),然后计算均方根,以查看该时间段是否静默。准确的字节数。25秒取决于样本的音频速率

因此,假设您有字节[]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;
}
/**计算一组信号大小的RMS体积*/
公共双卷项(整数开始,整数长度){
长和=0;
int end=开始+长度;
int len=长度;
如果(结束>音频数据.length){
end=audioData.length;
len=结束-开始;
}
如果(len==0){
返回0;
}
for(int i=开始;i