Exo Player在动画容器碎片时变黑,如何修复?

3

我在一个Fragment中使用了Exoplayer视图,当我从Activity中动画化Fragment容器视图时,Exo Player会变成黑色。
我使用了setKeepContentOnPlayerReset(true);来保留最后一帧,效果很好。

但是,当视频结束后我调用Fragment容器视图的动画(滑动动画),Exo Player将显示黑屏。(即使在Fragment退出转换也会对Exo Player产生相同的问题,这一次我没有替换Fragment,只是对容器视图进行了动画处理,问题仍然存在)

我对此问题一无所知,如果有人能分享一些相关的想法,那将非常有帮助。欢迎针对此问题提出任何建议和答案。谢谢。

2个回答

7

事实证明,将"app:surface_type"设置为"texture_view" 可以解决问题。这将使Exo player使用纹理视图(texture view)而不是表面视图(surface view),从而使动画和滚动更加流畅。

在文档中说明如下:

在早期版本中,将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"/>

我想添加左右滑动手势动画(类似于视图翻页器)。 - Vikas
这样可以解决从暂停到恢复活动状态时出现的黑色背景问题。太棒了。 - Faldu Jaldeep

-1

你可以使用这两个解决方案...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接