Easy Visualizer with ExoPlayer

Subash Aryc
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. :)

--

--