exoplayer 2.11.* версия выдает ошибку рендеринга на устройствах Android 5.0 / 5.1 (Lollipop)

#java #android #firebase #exoplayer #exoplayer2.x

#java #Android #огневая база #экзоплейер #exoplayer2.x экзоплеер2.x #firebase #exoplayer #exoplayer2.x

Вопрос:

Я использую exoplayer для потоковой передачи моего аудиофайла из firebase storage в мое приложение для Android. exoplayer отлично работает в версиях Android, которые >= 6.0 . Но на Android 5.0/5.1(Lollipop) устройствах exoplayer выдает мне Renderer error .

Вот ошибка, которую я получил:

 E/AudioTrack: AudioFlinger could not create track, status: -12
E/AudioTrack-JNI: Error -12 initializing AudioTrack
E/android.media.AudioTrack: Error code -20 when initializing AudioTrack.
E/ExoPlayerImplInternal: Renderer error: index=1, type=audio, format=Format(null, null, null, audio/mpeg, null, -1, null, [-1, -1, -1.0], [2, 32000]), rendererSupport=YES
      com.google.android.exoplayer2.ExoPlaybackException: com.google.android.exoplayer2.audio.AudioSink$InitializationException: AudioTrack init failed: 0, Config(32000, 12, 32000)
        at com.google.android.exoplayer2.BaseRenderer.createRendererException(BaseRenderer.java:359)
        at com.google.android.exoplayer2.audio.MediaCodecAudioRenderer.processOutputBuffer(MediaCodecAudioRenderer.java:831)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.drainOutputBuffer(MediaCodecRenderer.java:1590)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:721)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:599)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:329)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:135)
        at android.os.HandlerThread.run(HandlerThread.java:61)
     Caused by: com.google.android.exoplayer2.audio.AudioSink$InitializationException: AudioTrack init failed: 0, Config(32000, 12, 32000)
        at com.google.android.exoplayer2.audio.DefaultAudioSink$Configuration.buildAudioTrack(DefaultAudioSink.java:1428)
        at com.google.android.exoplayer2.audio.DefaultAudioSink.initialize(DefaultAudioSink.java:527)
        at com.google.android.exoplayer2.audio.DefaultAudioSink.handleBuffer(DefaultAudioSink.java:608)
        at com.google.android.exoplayer2.audio.MediaCodecAudioRenderer.processOutputBuffer(MediaCodecAudioRenderer.java:824)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.drainOutputBuffer(MediaCodecRenderer.java:1590) 
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:721) 
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:599) 
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:329) 
        at android.os.Handler.dispatchMessage(Handler.java:98) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.os.HandlerThread.run(HandlerThread.java:61) 
I/System.out: Player Error::com.google.android.exoplayer2.ExoPlaybackException: com.google.android.exoplayer2.audio.AudioSink$InitializationException: AudioTrack init failed: 0, Config(32000, 12, 32000)
E/Render TAG: TYPE_RENDERER: AudioTrack init failed: 0, Config(32000, 12, 32000)
  

Вот мой код для потокового аудио:

 //Setting Up Exoplayer
private void SetupPlayer(){
// Create a data source factory.
dataSourceFactory =
        new DefaultHttpDataSourceFactory(Util.getUserAgent(this
                , getApplicationInfo().loadLabel(getPackageManager()).toString()));
loadControl = new DefaultLoadControl.Builder()
        .setBufferDurationsMs(MIN_BUFFER_DURATION, MAX_BUFFER_DURATION, MIN_PLAYBACK_START_BUFFER, MIN_PLAYBACK_RESUME_BUFFER).createDefaultLoadControl();

@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode = DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER;

renderersFactory = new DefaultRenderersFactory(this) .setExtensionRendererMode(extensionRendererMode);

// Create a progressive media source pointing to a stream uri.
        mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
        .createMediaSource(Uri.parse(audio_url));
// Create a player instance.
simpleExoPlayer =  new SimpleExoPlayer.Builder(this,renderersFactory).setLoadControl(loadControl).build();
// Prepare the player with the media source.
simpleExoPlayer.prepare(mediaSource, true, true);
}
  

Я искал переполнение стека, но не смог найти никаких ответов. Версия, которую exoplayer я использую, была 2.11.8 . Я не знаю, как исправить эту ошибку. Пожалуйста, помогите мне с некоторыми решениями для исправления этой ошибки на устройствах Android 5.0.

Ответ №1:

Недавно у меня возникла точно такая же проблема с API <23 и ExoPlayer 2.13.2, и, копаясь, я нашел эту заметку на веб-сайте разработчиков ExoPlayer:

Официальный эмулятор Android (…) поддерживает ExoPlayer при условии, что системный образ имеет уровень API не менее 23. Системные образы с более ранними уровнями API не поддерживают ExoPlayer.

К сожалению, у меня нет устройства с поддержкой API-21. Тем не менее, я оставлю эту заметку для будущих поколений.