SimpleExoPlayer audio fails after repeated use
- Dominant language
- Java
- Stars
- 21.9k
- Forks
- 6k
- PR merge metrics
- No merged PRs in 30d
Description
If SimpleExoPlayer is created, used and released many times, eventually audio stops working.
Audio in all apps then fails. Other apps that use ExoPlayer (e.g. YouTube) usually crash. The device must be rebooted to fix.
This appears to only affect Android 5+ devices, and may take thousands of repeats.
Affected devices:
Nvidia Shield
Some Minix devices
Usually the following exception is thrown:
Caused by: com.google.android.exoplayer2.ExoPlaybackException: MediaCodecAudioRenderer error, index=1, format=Format(null, null, null, audio/raw, null, -1, null, [-1, -1, -1.0], [1, 44100]), format_supported=YES
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:558)
at android.os.Handler.dispatchMessage(Handler.java:102)
... 2 more
Caused by: com.google.android.exoplayer2.audio.AudioSink$InitializationException: AudioTrack init failed 0 Config(44100, 4, 22050)
at com.google.android.exoplayer2.audio.DefaultAudioSink$Configuration.buildAudioTrack(DefaultAudioSink.java:2041)
at com.google.android.exoplayer2.audio.DefaultAudioSink.buildAudioTrack(DefaultAudioSink.java:854)
at com.google.android.exoplayer2.audio.DefaultAudioSink.initializeAudioTrack(DefaultAudioSink.java:660)
at com.google.android.exoplayer2.audio.DefaultAudioSink.handleBuffer(DefaultAudioSink.java:736)
at com.google.android.exoplayer2.audio.MediaCodecAudioRenderer.processOutputBuffer(MediaCodecAudioRenderer.java:639)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.drainOutputBuffer(MediaCodecRenderer.java:1898)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:823)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:978)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:482)
... 3 more
Suppressed: com.google.android.exoplayer2.audio.AudioSink$InitializationException: AudioTrack init failed 0 Config(44100, 4, 22050)
... 12 more
I believe the root cause is allocation of new audio session IDs in the SimpleExoPlayer constructor. This occurs before setAudioSessionId() can be used and is therefore unavoidable.
The best workaround is to reuse SimpleExoPlayer. However, this can pose problems when operating on different threads and recovering from errors.
Contributor guide
Assessment
This issue has not been assessed yet.