google / google/ExoPlayer

SimpleExoPlayer audio fails after repeated use

Open
#9,541 21 comments 0 reactions 1 assignee Assigned to @tianyif View on GitHub
bug
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.