Exo Player 在对容器片段进行动画处理时变黑,如何解决?

Exo Player becomes black when animating the container fragment, How to fix it?

我在片段中有一个 Exoplayer 视图,当我从 activity 为片段容器视图设置动画时,exo 播放器将变为黑色。
我使用 setKeepContentOnPlayerReset(true); 来保留最后一帧并且它工作正常。

但是当我在视频结束后在片段容器视图(即Frame Layout)上调用animate(滑动动画)时,Exo播放器会显示黑屏。 (即使是片段退出过渡也会在 Exo 播放器上产生同样的问题,这次我没有替换只是动画容器视图的片段,问题仍然存在)

我还没有与此问题相关的任何线索,如果有人可以分享与此相关的一些想法,那将非常有帮助。欢迎与此相关的每一个建议和答案。谢谢你。

事实证明,对“app:surface_type”使用“texture_view”将解决问题,这将使 Exo 播放器使用纹理视图而不是表面视图,从而制作动画和滚动顺利。

在文档中说

On earlier releases, this could result in unwanted effects when a SurfaceView was placed into a scrolling container, or when it was subjected to animation. Such effects included the SurfaceView’s contents appearing to lag slightly behind where it should be displayed, and the view turning black when subjected to animation

在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)
             }
    
         }
     })