ExoPlayer的PlayerView如何使用TextureView而不是SurfaceView?
Posted
技术标签:
【中文标题】ExoPlayer的PlayerView如何使用TextureView而不是SurfaceView?【英文标题】:How to use TextureView instead of SurfaceView with PlayerView of ExoPlayer? 【发布时间】:2018-09-03 16:41:45 【问题描述】:我知道可以在 ExoPlayer 中使用 TextureView。但我找不到任何关于如何以正确方式实现此功能的示例。你能帮我解决这个问题吗?
【问题讨论】:
【参考方案1】:PlayerView
有一个 xml 属性 surface_type
,让您可以选择是使用 SurfaceView
还是 TextureView
。
(注意:SimpleExoPlayerView
在最近的版本中已重命名为 PlayerView
,因为它仅依赖于 Player
接口,不再依赖于 SimpelExoPlayerView。)
您可以选择 texture_view、surface_view(默认)或无。详情请见the main section of the JavaDoc of PlayerView。
<com.google.android.exoplayer2.ui.PlayerView android:id="@+id/player_view"
app:surface_type="texture_view"
android:layout_
android:layout_/>
【讨论】:
我的视频没有全屏播放?任何选项【参考方案2】:来自the documentation:
如果您需要对播放器控件和渲染视频的
Surface
进行细粒度控制,您可以直接使用 SimpleExoPlayer 的 @ 设置播放器的目标SurfaceView
、TextureView
、SurfaceHolder
或Surface
分别为 987654331@、setVideoTextureView
、setVideoSurfaceHolder
和setVideoSurface
方法。
所以这里的相关部分是setVideoTextureView()
。比如:
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context, trackSelector);
TexturView textureView = findViewById(texture_view);
player.setVideoTextureView(textureView);
您还可以从SurfaceTexture
创建一个Surface
,您可以通过TextureView
的setSurfaceTextureViewListener()
获得该Surface
。请参阅 TextureView's documentation 和 this post。然后你可以在播放器上调用setSurface(...)
。
但是现在SimpleExoPlayer
拥有TextureView
设置器(我们在旧的ExoPlayer 中并不总是有这个),你真的不需要再这样做了。作为另一个参考,这里是 the issue on ExoPlayer 关于支持这一点。
作为旁注,您可以看到SurfaceView
和TextureView
here 之间的区别。一般建议使用SurfaceView
,但有细微差别。
[编辑]
如果你想即时执行,你可以像我上面写的那样实例化SimpleExoPlayer
(不是SimpleExoPlayerView
),然后在你的PlayerView
上调用setPlayer(...)
(你可以定义在 XML 中或动态)。
如果您不需要即时设置表面/纹理视图,则可以通过app:surface_type="texture_view"
在布局 XML 中的PlayerView
上设置它。
【讨论】:
凯尔维恩,谢谢你的回答。我试过了,但是如果我使用原始 TextureView 而不是 SimpleExoPlayer,我将无法从 ExoPlayer 的优势中受益,例如播放控件、固定纵横比等。如果我选择使用 TextureView,我应该自己编写这些功能吗?顺便说一句,我必须使用 TextureView,因为用户应该能够像在 Youtube 上一样拖动播放器视图,而 SurfaceView 在 Nougat 下方没有给出平滑的结果。 你应该可以像我的例子一样使用SimpleExoPlayer
with TextureView
。你的意思是SimpleExoPlayerView
?如果您正在使用它,您可以在PlayerView
上调用setPlayer()
,并确保播放器已经设置了TextureView
。这有意义吗?
实际上,在阅读问题时,凯尔的回答比我的更准确。 :) 不确定将问题更改为“使用 ExoPlayer 的 PlayerView”是否有意义,这显然是预期的问题。谢谢。
是的,这将是一个更准确的问题标题。改了。
PlayerView
默认使用SurfaceView
,通常不需要解决此问题。因此,如果它有效,那么您应该很好地使用SurfaceView
。【参考方案3】:
注意,TextureView
只能在硬件加速窗口中使用。在软件中渲染时,TextureView 不会绘制任何内容。所以设置表面类型后
<com.google.android.exoplayer2.ui.PlayerView android:id="@+id/player_view"
app:surface_type="texture_view"
android:layout_
android:layout_/>
您需要确保启用了硬件加速,转到清单文件并添加此行
在应用程序级别:<application android:hardwareAccelerated="true" ...>
【讨论】:
以上是关于ExoPlayer的PlayerView如何使用TextureView而不是SurfaceView?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Exoplayer 播放从 Mediastore 获取的视频
PagerAdapter 总是在 ViewPager 中被调用两次