Can't play video with exoplayer on recycler view

Viewed 776

I'm loading some videos from firebase storage with ExoPlayer inside my RecyclerView but for some reason when I scroll to the bottom of the RecyclerView (and probably the item with the player are being destroyed) and I go up again the video does not play and I'm getting this error below:

Error:

2022-03-27 12:24:53.519 8762-11091/com.george.socialmeme E/ACodec: Unable to instantiate codec 'OMX.MTK.VIDEO.DECODER.AVC' with err 0xfffffff4.
2022-03-27 12:24:53.519 8762-11091/com.george.socialmeme E/ACodec: signalError(omxError 0xfffffff4, internalError -12)
2022-03-27 12:24:53.519 8762-11090/com.george.socialmeme E/MediaCodec: Codec reported err 0xfffffff4, actionCode 0, while in state 1
2022-03-27 12:24:53.578 8762-11093/com.george.socialmeme E/ACodec: Unable to instantiate codec 'OMX.MTK.VIDEO.DECODER.AVC' with err 0xfffffff4.
2022-03-27 12:24:53.578 8762-11093/com.george.socialmeme E/ACodec: signalError(omxError 0xfffffff4, internalError -12)
2022-03-27 12:24:53.578 8762-11092/com.george.socialmeme E/MediaCodec: Codec reported err 0xfffffff4, actionCode 0, while in state 1
2022-03-27 12:24:53.584 8762-11044/com.george.socialmeme E/MediaCodecVideoRenderer: Video codec error
      com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.MTK.VIDEO.DECODER.AVC, Format(1, null, null, video/avc, avc1.4D401E, -1, null, [720, 720, 30.0], [-1, -1])
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1017)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:546)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1437)
        at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:799)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:950)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:779)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:998)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:499)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:246)
        at android.os.HandlerThread.run(HandlerThread.java:67)
     Caused by: android.media.MediaCodec$CodecException: Failed to initialize OMX.MTK.VIDEO.DECODER.AVC, error 0xfffffff4
        at android.media.MediaCodec.native_setup(Native Method)
        at android.media.MediaCodec.<init>(MediaCodec.java:1912)
        at android.media.MediaCodec.createByCodecName(MediaCodec.java:1890)
        at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter$Factory.createCodec(SynchronousMediaCodecAdapter.java:74)
        at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter$Factory.createAdapter(SynchronousMediaCodecAdapter.java:49)
        at com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory.createAdapter(DefaultMediaCodecAdapterFactory.java:130)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:1095)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1006)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:546) 
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1437) 
        at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:799) 
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:950) 
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:779) 
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:998) 
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:499) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:246) 
        at android.os.HandlerThread.run(HandlerThread.java:67) 
2022-03-27 12:24:53.587 8762-11044/com.george.socialmeme E/ExoPlayerImplInternal: Playback error
      com.google.android.exoplayer2.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(1, null, null, video/avc, avc1.4D401E, -1, null, [720, 720, 30.0], [-1, -1]), format_supported=YES
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:575)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:246)
        at android.os.HandlerThread.run(HandlerThread.java:67)
     Caused by: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.MTK.VIDEO.DECODER.AVC, Format(1, null, null, video/avc, avc1.4D401E, -1, null, [720, 720, 30.0], [-1, -1])
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1017)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:546)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1437)
        at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:799)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:950)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:779)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:998)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:499)
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:246) 
        at android.os.HandlerThread.run(HandlerThread.java:67) 
     Caused by: android.media.MediaCodec$CodecException: Failed to initialize OMX.MTK.VIDEO.DECODER.AVC, error 0xfffffff4
        at android.media.MediaCodec.native_setup(Native Method)
        at android.media.MediaCodec.<init>(MediaCodec.java:1912)
        at android.media.MediaCodec.createByCodecName(MediaCodec.java:1890)
        at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter$Factory.createCodec(SynchronousMediaCodecAdapter.java:74)
        at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter$Factory.createAdapter(SynchronousMediaCodecAdapter.java:49)
        at com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory.createAdapter(DefaultMediaCodecAdapterFactory.java:130)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:1095)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1006)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:546) 
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1437) 
        at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:799) 
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:950) 
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:779) 
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:998) 
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:499) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:246) 
        at android.os.HandlerThread.run(HandlerThread.java:67) 

Code for ExoPlayer inside my adapter:

ExoPlayer player = new ExoPlayer.Builder(context).build();
MediaItem mediaItem = MediaItem.fromUri(postList.get(position).getVideoUrl());
player.setMediaItem(mediaItem);
player.prepare();
videoViewHolder.andExoPlayerView.setPlayer(player);

player.addAnalyticsListener(new AnalyticsListener() {

    @Override
    public void onPlayerError(@NonNull EventTime eventTime, @NonNull PlaybackException error) {
        Toast.makeText(context, "" + error.getMessage(), Toast.LENGTH_SHORT).show();
    }
});
2 Answers

If you use Jetpack Compose, then you could use DisposableEffect to clean up the Exoplayer after using it: enter image description here

This is due to the creation of many exoplayer instances and the RAM will run out at some time. To do this, after the end of the video, you need to clear the exoplayer. I used Jetpack Compose and ExoPlayer and the code looks like this:

DisposableEffect(
                AndroidView(
                    factory = { context ->
                        PlayerView(context).apply {
                            player = exoPlayer
                            player?.playWhenReady = true
                            resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FILL
                            useController = true
                        }
                    }
                )
            ){
                onDispose {
                    exoPlayer.release()
                }
            }

ExoPlayer

val mediaItem = MediaItem.fromUri(Uri.parse(URL)) 
 val exoPlayer = remember(context) {
                ExoPlayer.Builder(context).build().apply {

                    addListener(object : Listener {
                        override fun onPlaybackStateChanged(playbackState: Int) {
                            if (playbackState == STATE_ENDED) {
                                //TODO
                            }
                            super.onPlaybackStateChanged(playbackState)
                        }

                        override fun onPlayerError(error: PlaybackException) {
                            Log.d("TAG", "onPlayerError: ${error.message}")
                            super.onPlayerError(error)
                        }
                    })


                    setMediaSource(
                        ProgressiveMediaSource.Factory(dataSourceFactory)
                            .createMediaSource(mediaItem) 
                    )
                    prepare()
                    seekTo(0)
                    playbackDuration?.let(::seekTo)
                }
            } 
Related