java - 使用musicg库在android中创建频谱图

标签 java android audio

我正在尝试在 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);*/
        }
    }

最佳答案

比我原来的帖子中的答案有所改进。

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);
    }
}

这将通过在绘制到 Canvas 之前创建位图来提高性能。

关于java - 使用musicg库在android中创建频谱图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24679849/

相关文章:

javascript - ASP Net Core FileContentResult音频文件到Safari

css - 创建一个 tumblr 主题 - 音频帖子不显示在博客上

java - 为什么我的 while 循环无法使用 system.in.read() 获取控制台中的最后一行?

java - Spring 过滤器在初始化函数后丢失设置变量

android - RecyclerView 为列表中的每个项目提供不同的 ItemTouchHelper

java - 使用 put/getSerializable 进行 Android 序列化

android - Wowza:音频文件中的Vod自适应比特率流传输问题

java - php checkdnsrr java等价物

java - NamedQuery 未将表置于 OnetoOne 关系中

java - Udacity Sunshine android 应用程序 -- MainActivity.java 不一致 -- SDK 目标错误?