我正在尝试在Android中创建一个谱图可视化。我使用android设备以.PCM格式记录声音,然后将其转换为.WAV,以便可以使用musicg库https://code.google.com/p/musicg/对其进行分析。
使用musicg,我可以创建一个记录的.WAV谱图,从这个谱图中,我可以提取频率时域数据作为一个双倍。
接下来我要做的是如何在Android中可视化这些数据。任何帮助都将不胜感激。
在user3161880回答之后,我尝试了以下方法,但是我没有得到任何吸引到屏幕上的东西。我可以画一个圆圈,如user3161880答案中所示。知道为什么这不管用吗?
private static class SpectrogramView extends View {
private Paint paint = new Paint();
private double [][] data;
public SpectrogramView(Context context, double [][] data) {
super(context);
this.data = data;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (data != null) {
paint.setStrokeWidth(1);
canvas.drawColor(Color.WHITE);
int width = data.length;
int height = data[0].length;
for(int i = 0; i < width; i++) {
for(int j = 0; j < height; j++) {
int value;
value = 255 - (int)(data[i][j] * 255);
paint.setColor(value<<16|value<<8|value|255<<24);
canvas.drawPoint(i, height-1-j, paint);
}
}
} else {
System.err.println("Data Corrupt");
}
//draw circle
/*paint.setColor(Color.RED);
canvas.drawColor(Color.BLUE);
canvas.drawCircle(100.0f, 100.0f, 50.0f, paint);*/
}
}发布于 2014-07-15 11:10:08
一个比我原来的帖子更好的答案。
private static class SpectrogramView extends View {
private Paint paint = new Paint();
private Bitmap bmp;
public SpectrogramView(Context context, double [][] data) {
super(context);
if (data != null) {
paint.setStrokeWidth(1);
int width = data.length;
int height = data[0].length;
int[] arrayCol = new int[width*height];
int counter = 0;
for(int i = 0; i < height; i++) {
for(int j = 0; j < width; j++) {
int value;
int color;
value = 255 - (int)(data[j][i] * 255);
color = (value<<16|value<<8|value|255<<24);
arrayCol[counter] = color;
counter ++;
}
}
bmp = Bitmap.createBitmap(arrayCol, width, height, Config.ARGB_8888);
} else {
System.err.println("Data Corrupt");
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bmp, 0, 100, paint);
}
}这将通过在画布绘制之前创建一个位图来提高性能。
发布于 2014-07-10 16:58:59
如果您愿意显示预先录制的音频的静止谱图,一个简单的View就足够了。可以重写视图的onDraw方法。在这里,您可以访问绘制背景的Canvas。
剩下的是您的显示逻辑,它将double映射到颜色和时频网格,以x-y协调画布。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
private static class MyView extends View {
Paint paint = new Paint();
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// draw circle
paint.setColor(Color.RED);
canvas.drawColor(Color.BLUE);
canvas.drawCircle(100.f, 100.f, 50.f, paint);
}
}
}https://stackoverflow.com/questions/24679849
复制相似问题