我正在使用一个记录音频的库,我可以每次监听一个新的字节数组,如果填充缓冲区,那么我得到这个回调:
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);
}
谢谢!
答案 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流量计。对于峰值仪表,只需找到所有样品的最大值。