如何为Android可视化工具生成动态颜色

时间:2016-10-19 12:54:02

标签: android audio android-mediaplayer android-music-player visualizer

我正在使用Android音乐播放器。我正在尝试将音频字节转换为rgb颜色,以便我可以在播放音频时以波形显示它。我目前正在使用felixpalmer API,它能够生成单色波形。

以下是代码:

private void setupVisualizerFxAndUI() {

    // Create the Visualizer object and attach it to our media player.
    Paint linePaint = new Paint();
    linePaint.setStrokeWidth(2f);
    linePaint.setAntiAlias(true);
    linePaint.setColor(ContextCompat.getColor(getContext(), R.color.colorPrimary));

    final LineRenderer lineRenderer = new LineRenderer(linePaint, true);
    mVisualizerView.addRenderer(lineRenderer);

    mVisualizer = new Visualizer(mediaPlayer.getAudioSessionId());
    mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
    mVisualizer.setDataCaptureListener(
            new Visualizer.OnDataCaptureListener() {
                public void onWaveFormDataCapture(Visualizer visualizer,
                                                  byte[] bytes, int samplingRate) {
                    mVisualizerView.updateVisualizer(bytes);
                    onFFTData(bytes, lineRenderer);
                }

                public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
                    //onFFTData(bytes, lineRenderer);
                }
            }, Visualizer.getMaxCaptureRate() / 2, true, false);
}

请指出一些资源,我可以阅读有关如何从此音频字节代码生成动态rgb颜色的信息。因此,我的音乐播放器可以显示动态颜色的波形而不是当前显示的歌手颜色。

1 个答案:

答案 0 :(得分:0)

我注意到这两行:

    final LineRenderer lineRenderer = new LineRenderer(linePaint, true);
    mVisualizerView.addRenderer(lineRenderer);

我觉得这很有希望。所以我按照GitHub链接找到了:https://github.com/felixpalmer/android-visualizer/blob/master/src/com/pheelicks/visualizer/renderer/LineRenderer.java

没关系。他对音频数据做了一些数学计算,然后生成一些点然后调用

      canvas.drawLines(mPoints, mPaint);

您所要做的就是复制/继承LineRenderer类。计算所需的颜色,然后在mPaint.setColor(color)来电之前致电drawLines

因为Visualizer addRenderer方法接受任何Renderer实例(Renderer是他的所有渲染器继承的抽象类),所以您可以创建自己的子类和他的visualizer很乐意使用你的类来绘制可视化。

事实上,您的代码段显示了一个构造函数LineRenderer(linePaint, true),我甚至没有在源代码中看到它。他确实有一个构造函数LineRenderer(Paint paint, Paint flashPaint, boolean cycleColor)。当您设置cycleColor true时,每个帧的颜色都会发生变化,因此LineRenderer实际上可以生成不同颜色的波形。您可以在源代码中看到他是如何做到的(第99行)。你可以从这开始,作为一个向你想要的方向前进的例子。

他的源代码具有您需要的所有成分。快乐的编码。