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.