Easy Visualizer with ExoPlayer
1 min readAug 4, 2019
OK, lets get started.
Add the latest version of the Exoplayer into your application. I am using ‘2.10.3’ for this simple demo.
Create new class called RendererFactory.kt
import android.content.Context
import android.os.Handler
import com.google.android.exoplayer2.DefaultRenderersFactory
import com.google.android.exoplayer2.Renderer
import com.google.android.exoplayer2.audio.AudioProcessor
import com.google.android.exoplayer2.audio.AudioRendererEventListener
import com.google.android.exoplayer2.audio.TeeAudioProcessor
import com.google.android.exoplayer2.drm.DrmSessionManager
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector
import java.util.*class RendererFactory(context: Context, var listener: TeeAudioProcessor.AudioBufferSink) :
DefaultRenderersFactory(context) {override fun buildAudioRenderers(
context: Context?,
extensionRendererMode: Int,
mediaCodecSelector: MediaCodecSelector?,
drmSessionManager: DrmSessionManager<FrameworkMediaCrypto>?,
playClearSamplesWithoutKeys: Boolean,
enableDecoderFallback: Boolean,
audioProcessors: Array<out AudioProcessor>?,
eventHandler: Handler?,
eventListener: AudioRendererEventListener?,
out: ArrayList<Renderer>?
) {
val audioProcessor = Array<AudioProcessor>(1) {
TeeAudioProcessor(listener)
}
super.buildAudioRenderers(
context,
extensionRendererMode,
mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
enableDecoderFallback,
audioProcessor,
eventHandler,
eventListener,
out
)
}
Now, while creating the ExoPlayer instance set the renderer factory .
// create default track selector
val trackSelector = DefaultTrackSelector()
// create default load control with increase buffer size
val loadControl = PlayerHelper.getLoadController(10)var rendererFactory = RendererFactory(this, object : TeeAudioProcessor.AudioBufferSink {
override fun flush(sampleRateHz: Int, channelCount: Int, encoding: Int) {Timber.d("Sample Rate: $sampleRateHz channelCount: $channelCount and encoding; $encoding")
}
override fun handleBuffer(buffer: ByteBuffer?) {
// Apply fft &
// pass the buffer data to your visualizer.
}
})
val player = ExoPlayerFactory.newSimpleInstance(this, rendererFactory, trackSelector, loadControl)
That’s it. :)