android - 全屏 Exoplayer

标签 android fullscreen exoplayer

我尝试在 RecyclerViewViewPager 中使用 exoplayer 显示演示视频 (.mp4)。我展示了带有自定义布局的视频 Controller 。到目前为止一切顺利。

现在尝试像其他视频播放器一样全屏显示视频,但在 exoplayer 文档中找不到好的方法。

谁能帮帮我?

最佳答案

ExoPlayer 库目前不提供启用/禁用全屏模式的内置方法。恐怕您需要自己实现或为此寻找一些第三方代码。

基本上需要两个步骤:

a) 将窗口和 Activity 属性设置为全屏和/或沉浸式模式,并(如果需要)更改为横向模式。那并不难。参见 this page on Android Developers .

b) 将渲染过渡到 SimpleExoPlayerView(实际上是关于 Surface),它以沉浸式模式覆盖整个视口(viewport)。这对于在所有 API 级别上实现最佳用户体验而言更具挑战性。

为了获得最佳的用户体验,我们希望播放器在切换到全屏和返回时继续播放,以无缝地继续播放。在 RecyclerView 中,解决所有 API 级别的问题有点棘手。

方法一

最简单的方法可能是拥有一个单独的 SimpleExoPlayerView 实例,一旦进入沉浸式模式,就将其放在布局的顶部(有些人为此打开一个带有第二个 View 的对话框,有些人只是将第二个 View 放在顶部以某种方式在布局中并按需显示/隐藏它)。

然后您从 RV 中嵌入的 SimpleExoPlayerView 分离播放器实例,并通过调用 static helper method 将其附加到全屏 View :

SimpleExoPlayerView.switchTargetView(simpleExoPlayer, oldPlayerView, newPlayerView);

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

方法二

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

这对于简单的布局可以很好地工作,但对于可能包括 fragment 、viewpager、recyclerviews 的复杂布局,这可能是一个非常侵入性的操作,导致某些东西闪烁或短暂中断播放(在某些 API 级别上,例如从中删除播放器 View 时) View 层次结构)。不过,我已经看到这对各种布局都很有效。

进一步的方法/挑战

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

关于android - 全屏 Exoplayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48420974/

相关文章:

java - Eclipse Android java.lang.NoClassDefFoundError

c# - 全屏WP通用应用

python - PyQt 显示全屏图像

android - 如何为 ExoPlayer v2.5+ 使用 MediaSession 扩展

android - 如何在 < 4.0 设备上使用 Actionbarsherlock 在 Actionbar 中强制溢出菜单

android - 如何在 Android 中的两个 Activity 之间传递对象列表?

android - 如何使用 google android Exoplayer 为广告和视频使用单一播放器

java - 使用 Google Media Framework Exoplayer 的视频播放器空指针异常

android - 从联系人获取电子邮件、ID 和电话(不使用 Activity )

java - 在 GWT 中访问 Javascript 变量