全屏Exoplayer

Ash*_*kan 8 android fullscreen exoplayer

我尝试在RecyclerViewViewPager中使用exoplayer显示节目视频(.mp4).我用自定义布局显示视频控制器.到现在为止还挺好.

现在尝试像其他视频播放器一样全屏显示视频如何使用,但在exoplayer doc中找不到好方法.

谁能帮我?

Bla*_*rai 12

您可以从 .xml 文件中轻松完成此操作ExoPlayer。设置以下属性:

app:resize_mode="fill"
Run Code Online (Sandbox Code Playgroud)

  • 这并没有回答最初的问题,即如何使视频全屏/沉浸式。所有这一切都是应用填充调整大小,以便任何流媒体视频适合视图。如果您的视图位于回收器中,它将限制为列表项的大小。 (3认同)

mar*_*ger 11

ExoPlayer库目前不提供启用/禁用全屏模式的内置方法.你需要自己实现这个,或者为此我找到一些第三方代码.

基本上需要两个步骤:

a)将窗口和活动属性设置为全屏和/或沉浸式模式,并(如果需要)更改为横向模式.这并不困难.在Android开发者上查看此页面.

b)将渲染转换为SimpleExoPlayerView(实际上它是关于Surface),它以沉浸模式覆盖整个视口.在所有API级别上实现最佳用户体验更具挑战性.

为了获得最佳的用户体验,我们希望在转换到全屏和返回时保持播放器播放,以便无缝继续播放.在RecyclerView中,对于所有API级别来说,这是一个很难解决的问题.

方法1

最简单的方法可能是单独的SimpleExoPlayerView实例,只要您进入沉浸式模式,就会将其置于布局之上(有些人打开一个带有第二个视图的对话框,有些人在布局中只有第二个视图.以某种方式并按需显示/隐藏它.

然后将播放器实例与嵌入在RV中的SimpleExoPlayerView分离,并通过调用静态辅助方法将其附加到全屏视图:

SimpleExoPlayerView.switchTargetView(simpleExoPlayer, oldPlayerView, newPlayerView);
Run Code Online (Sandbox Code Playgroud)

这种方法在API> = 23时非常有效.使用API​​ 23,添加了允许动态交换表面的方法MediaCodec.setOutputSurface.上面的静态方法确保应用此技术.因此,音频和视频继续播放,进入和退出全屏的用户体验非常流畅.对于API <= 22,需要创建一个新的编解码器实例来交换到另一个表面.这会中断播放,并且此方法的用户体验会降低.

方法2

为避免在较低的API级别上交换到另一个表面,您需要使用单个表面并以某种方式将其转换为全屏.您可以隐藏除SimpleExoPlayerView以外的所有内容,并设置布局宽度和高度以匹配其父级,或者您可以使用占位符替换视频视图并将其放在顶部和背面.

对于简单的布局,这可以很好地工作,但是复杂的布局可能包括片段,viewpagers,recyclerviews这可能是一个非常干扰的操作,导致某些东西闪烁或很快中断播放(在某些API级别,例如从视图层次结构中删除播放器视图时) ).我已经看到这很好地适用于各种布局.

进一步的方法/挑战

当您深入挖掘和/或根本不使用SimpleExoPlayerView时,可能还有其他可能更好的方法.

  • `SimpleExoPlayerView.switchTargetView` 已弃用。您现在应该使用 [`PlayerView.switchTargetView`](https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/ui/PlayerView.html#switchTargetView-com.google.android.exoplayer2.Player- com.google.android.exoplayer2.ui.PlayerView-com.google.android.exoplayer2.ui.PlayerView-)。 (3认同)