2

I am working on a radio app . I used exoplayer as player on my project and I want to add audio visualizer on my playeractivity . but I couldn't find any tutorial or sample for it . I just made a customeRenderfactory and add it to my player . But I don't know what should I do more ? any help or suggestion ? I should mention my player work fine right now and I just need to find a solution to add visualizer to it . RenderFactory class :

public class RenderFactory extends DefaultRenderersFactory {
private TeeAudioProcessor.AudioBufferSink listener;
private AudioProcessor[] aMProcessors;
private TeeAudioProcessor teeAudioProcessor;
private AudioRendererEventListener eventListener;

public RenderFactory(Context context, TeeAudioProcessor.AudioBufferSink myListener) {
    super(context);
    this.listener = myListener;
    teeAudioProcessor = new TeeAudioProcessor(this.listener);
}

@Override
protected void buildAudioRenderers(Context context, int extensionRendererMode, MediaCodecSelector mediaCodecSelector, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, boolean playClearSamplesWithoutKeys, boolean enableDecoderFallback, AudioProcessor[] audioProcessors, Handler eventHandler, AudioRendererEventListener eventListener, ArrayList<Renderer> out) {

    aMProcessors = new AudioProcessor[]{teeAudioProcessor};
    super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys, enableDecoderFallback, aMProcessors, eventHandler, eventListener, out);
 }
}

in my playerActivity I added this code and set renderfactory to my player but nothing happened .

   RenderFactory renderFactory = new RenderFactory(this, new TeeAudioProcessor.AudioBufferSink() {
        @Override
        public void flush(int sampleRateHz, int channelCount, int encoding) {
            // what should I add here?
        }

        @Override
        public void handleBuffer(ByteBuffer buffer) {
            // what should I add here?
        }
    });

I tried to followed this tutorial but I wasn't successful.

tutorial

shayegan
  • 71
  • 7

1 Answers1

4

To directly answer your question:

@Override
public void flush(int sampleRateHz, int channelCount, int encoding) {
     // you dont have to do anything here
}

@Override
public void handleBuffer(ByteBuffer buffer) {
    // This will give you the bytes from the sound that is going to be played
    // here you apply FFT so the audio move to the frequency domain instead of time based
}

You can learn more about FFT here

FFT is a well known algorithm, so you may find it implemented on plenty os sites. You can use this library if yout want, but there is standalone codes around.

Once you have the FFT array, you can draw the values in a view.

You can use this guy's code as an example: https://github.com/dzolnai/ExoVisualizer

There's also a blog post he made about it: https://www.egeniq.com/blog/alternative-android-visualizer

João Paulo Sena
  • 665
  • 4
  • 11