ExoPlayer Playback Error While Seeking to Position

196 Views Asked by At

I'm trying to make a media player on android as part of an android auto media player using ExoPlayer3. I have a slider which controls the playback position of the player implemented as follows:

chapterSeek.addOnChangeListener { _, value, fromUser ->
    if (fromUser) {
        val showHours = Duration.ofMillis(chapterSeek.valueTo.toLong()).toHours() > 0

        chapterDuration.text = "${
            getDuration(value.toLong(), showHours)
        } \\ ${
            getDuration(chapterSeek.valueTo.toLong(), showHours)
        }"

        parentActivity.startForegroundService(Intent(
                binding.root.context,
                MediaService::class.java
        ).apply {
            action = Constants.MediaServiceActions.SEEK_MEDIA.name

            putExtra(Constants.IntentDataKeys.CHAPTER_POSITION.name, value.toLong())
        })
    }
}

this calls a service which hosts the player and does the following:

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    if (intent == null) return START_NOT_STICKY
    if (intent.action == null) return START_NOT_STICKY
    val reciter = intent.getTypedSerializable<Reciter>(IntentDataKeys.RECITER.name)
    val chapter = intent.getTypedSerializable<Chapter>(IntentDataKeys.CHAPTER.name)

    mediaManager.whenReady { _, _ ->
        val chapterPosition =
                intent.getLongExtra(IntentDataKeys.CHAPTER_POSITION.name, -1L)

        when (intent.action) {
            DOWNLOAD_CHAPTERS.name      -> {
                if (reciter == null) return@whenReady
                showDownloadForegroundNotification(reciter)
                mediaManager.downloadChapters(reciter)
            }

            PLAY_MEDIA.name             -> {
                if (reciter == null || chapter == null) return@whenReady
                showMediaForegroundNotification(reciter, chapter)
                prepareMedia(reciter, chapter, chapterPosition)
            }

            PAUSE_MEDIA.name            -> pauseMedia()
            TOGGLE_MEDIA.name           -> toggleMedia()
            STOP_MEDIA.name             -> stopSelf()
            SKIP_TO_NEXT_MEDIA.name     -> skipToNextChapter()
            SKIP_TO_PREVIOUS_MEDIA.name -> skipToPreviousChapter()
            SEEK_MEDIA.name             -> seekChapterToPosition(chapterPosition)
        }
    }

    return START_STICKY
}

fun seekChapterToPosition(chapterPosition: Long) {
    if (chapterPosition != -1L) {
        Log.d("ExoPlayer_Audio_Player", "Seeking to $chapterPosition...")
        exoPlayer.seekTo(chapterPosition)
        setMediaPlaybackState(MediaSessionState.PLAYING)
    }
}

but when I try to seek on the slider continuously (or in a fast pace) I get this error:

19:33:37.346 MediaCodecAudioRenderer    E  Audio codec error
                                             java.lang.IllegalStateException: start failed
                                                 at android.media.MediaCodec.native_start(Native Method)
                                                 at android.media.MediaCodec.start(MediaCodec.java:2323)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecAdapter.$r8$lambda$eDpY_fTfY9aVkUSlR57RZPPXgr0(Unknown Source:0)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecAdapter$$ExternalSyntheticLambda1.run(Unknown Source:2)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecCallback.onFlushCompletedSynchronized(AsynchronousMediaCodecCallback.java:265)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecCallback.onFlushCompleted(AsynchronousMediaCodecCallback.java:244)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecCallback.lambda$flushAsync$0$com-google-android-exoplayer2-mediacodec-AsynchronousMediaCodecCallback(AsynchronousMediaCodecCallback.java:202)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecCallback$$ExternalSyntheticLambda0.run(Unknown Source:4)
                                                 at android.os.Handler.handleCallback(Handler.java:942)
                                                 at android.os.Handler.dispatchMessage(Handler.java:99)
                                                 at android.os.Looper.loopOnce(Looper.java:201)
                                                 at android.os.Looper.loop(Looper.java:288)
                                                 at android.os.HandlerThread.run(HandlerThread.java:67)
19:33:37.347 ExoPlayerImplInternal      E  Playback error
                                             com.google.android.exoplayer2.ExoPlaybackException: MediaCodecAudioRenderer error, index=1, format=Format(null, null, null, audio/mpeg, null, -1, null, [-1, -1, -1.0], [2, 44100]), format_supported=YES
                                                 at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:562)
                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                 at android.os.Looper.loopOnce(Looper.java:201)
                                                 at android.os.Looper.loop(Looper.java:288)
                                                 at android.os.HandlerThread.run(HandlerThread.java:67)
                                             Caused by: com.google.android.exoplayer2.mediacodec.MediaCodecDecoderException: Decoder failed: OMX.google.mp3.decoder
                                                 at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.createDecoderException(MediaCodecRenderer.java:918)
                                                 at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:799)
                                                 at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:982)
                                                 at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:486)
                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                 at android.os.Looper.loopOnce(Looper.java:201)
                                                 at android.os.Looper.loop(Looper.java:288)
                                                 at android.os.HandlerThread.run(HandlerThread.java:67)
                                             Caused by: java.lang.IllegalStateException: start failed
                                                 at android.media.MediaCodec.native_start(Native Method)
                                                 at android.media.MediaCodec.start(MediaCodec.java:2323)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecAdapter.$r8$lambda$eDpY_fTfY9aVkUSlR57RZPPXgr0(Unknown Source:0)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecAdapter$$ExternalSyntheticLambda1.run(Unknown Source:2)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecCallback.onFlushCompletedSynchronized(AsynchronousMediaCodecCallback.java:265)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecCallback.onFlushCompleted(AsynchronousMediaCodecCallback.java:244)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecCallback.lambda$flushAsync$0$com-google-android-exoplayer2-mediacodec-AsynchronousMediaCodecCallback(AsynchronousMediaCodecCallback.java:202)
                                                 at com.google.android.exoplayer2.mediacodec.AsynchronousMediaCodecCallback$$ExternalSyntheticLambda0.run(Unknown Source:4)
                                                 at android.os.Handler.handleCallback(Handler.java:942)
                                                 at android.os.Handler.dispatchMessage(Handler.java:99)
                                                 at android.os.Looper.loopOnce(Looper.java:201)
                                                 at android.os.Looper.loop(Looper.java:288)
                                                 at android.os.HandlerThread.run(HandlerThread.java:67)

what could be the issue? since it's not giving me any stacktrace related to any of my classes, I can't understand why its behaving like this.

I tried changing the pace of the scrubbing, but I still get the error every now and then, and the whole player refuses to continue playing until I change the media URI then go back to the previous one.

0

There are 0 best solutions below