如何将byte []缓冲区转换为幅度级别

时间:2014-03-10 15:11:57

标签: android audio

我正在使用一个记录音频的库,我可以每次监听一个新的字节数组,如果填充缓冲区,那么我得到这个回调:

public void onVoiceReceived(byte[] buffer) {

}

现在我想拿缓冲区并将其转换到一个水平,这样我就可以绘制振幅计。 我该如何翻译这些数据? 我不想创建另一个录像机并使用read()命令。

这是绘图代码

    private void drawCircleView(Canvas canvas, double ampValue) {
    // paint a background color
    canvas.drawColor(android.R.color.holo_blue_bright);

    // paint a rectangular shape that fill the surface.
    int border = 0;
    RectF r = new RectF(border, border, canvas.getWidth(), canvas.getHeight());
    Paint paint = new Paint();
    paint.setARGB(255, 100, 0, 0); // paint color GRAY+SEMY TRANSPARENT
    canvas.drawRect(r, paint);

    /*
     * i want to paint to circles, black and white. one of circles will bounce, tile the button 'swap' pressed and then other circle begin bouncing.
     */
    calculateRadiuses();
    // paint left circle(black)
    paint.setStrokeWidth(0);
    paint.setColor(getResources().getColor(android.R.color.holo_blue_light));
    canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, ampValue, paint);
}

谢谢!

1 个答案:

答案 0 :(得分:6)

byte []缓冲区是原始未格式化数据。要继续前进,您需要了解有关数据格式的信息。每个样本有多少位,字节序以及数据通道数。每个样本16位是最常见的。假设有两个数据通道并且它是16位,那么字节将按照这样排列[ch1 hi byte,ch1 lo byte,ch2 hi byte,ch2 lo byte,...]等等。

知道该信息后,您可以转换为双倍信息。通常,双幅度保持在(-1.0,1.0)范围内。

double[] samples = new double[buffer.Length];
for (int i = 0; i < buffer.Length; ++i)
{
    int intSample = ((buffer[i*2] << 8) | buffer[i*2 + 1]) << 16; 
    samples[i] = intSample * (1/4294967296.0); // scale to double (-1.0,1.0)
}

现在要获得原始水位计,首先需要确定是否需要峰值流量计或RMS流量计。对于峰值仪表,只需找到所有样品的最大值。