Exo Player становится черным при анимации фрагмента контейнера, как это исправить?

У меня есть представление Exoplayer во фрагменте, когда я анимирую представление контейнера фрагмента из активности, exo player станет черным.
я использовалsetKeepContentOnPlayerReset(true);чтобы сохранить последний кадр, и он работает нормально.

Но когда я вызываю анимацию (скользящую анимацию) в представлении контейнера фрагментов (это макет кадра) после окончания видео, проигрыватель Exo отображает черный экран. (даже переход при выходе из фрагмента также создает ту же проблему в проигрывателе Exo, на этот раз я не заменил фрагмент, просто анимировал представление контейнера, проблема все еще присутствует)

Я не имею никакого отношения к этой проблеме, это было бы очень полезно, если кто-нибудь может поделиться какой-либо идеей, связанной с этим. приветствует все предложения и ответы, связанные с этим. Спасибо.

2 ответа

Решение

Оказалось, что при использовании "texture_view" за "app:surface_type"решит проблему. Это заставит игрока Exo использовать вид текстуры вместо вида поверхности, что сделает анимацию и прокрутку плавными.

В документации говорится

В более ранних выпусках это могло привести к нежелательным эффектам, когда SurfaceView помещался в контейнер с прокруткой или когда он подвергался анимации. Такие эффекты включают в себя содержимое SurfaceView, которое немного отстает от того места, где оно должно отображаться, и отображение черного при анимации.

В файле xml мы можем включить просмотр текстуры следующим образом

 <com.google.android.exoplayer2.ui.SimpleExoPlayerView
    android:id="@+id/playerView"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    app:surface_type="texture_view"/>

вы можете использовать эти 2 решения ...

  1. добавьте этот атрибут в PlayerView:

            app:surface_type="texture_view"
    
  2. используйте это в своем коде:

                 val simpleExoPlayer = SimpleExoPlayer.Builder(requireContext())
         .setMediaSourceFactory(
             DefaultMediaSourceFactory(requireContext())
         )
         .build()
    
    
     simpleExoPlayer.addAnalyticsListener(object : AnalyticsListener {
    
         override fun onSurfaceSizeChanged(
             eventTime: AnalyticsListener.EventTime,
             width: Int,
             height: Int
         ) {
             super.onSurfaceSizeChanged(eventTime, width, height)
    
             val surfaceView = playerView.videoSurfaceView
    
             if (surfaceView is SurfaceView) {
                 surfaceView.holder.setFixedSize(width, height)
             }
    
         }
     })
    
Другие вопросы по тегам