繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM