我知道可以在 ExoPlayer 中使用 TextureView。但我找不到任何关于如何以正确方式实现此功能的示例。你能帮我解决这个问题吗?
3 回答
有PlayerView
一个 xml 属性surface_type
,您可以选择使用 aSurfaceView
还是 a TextureView
。
(注意:在最近的版本SimpleExoPlayerView
中已重命名为PlayerView
,因为它只依赖于Player
界面,不再依赖于 SimpelExoPlayerView。)
您可以选择 texture_view、surface_view(默认)或无。有关详细信息,请参阅PlayerView 的 JavaDoc 的主要部分。
<com.google.android.exoplayer2.ui.PlayerView android:id="@+id/player_view"
app:surface_type="texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
从文档中:
如果您需要对播放器控件和渲染视频的对象进行细粒度控制,
Surface
可以分别设置播放器的目标SurfaceView
、、或直接使用 SimpleExoPlayer 的、、和方法。TextureView
SurfaceHolder
Surface
setVideoSurfaceView
setVideoTextureView
setVideoSurfaceHolder
setVideoSurface
所以这里的相关部分是setVideoTextureView()
. 就像是:
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context, trackSelector);
TexturView textureView = findViewById(texture_view);
player.setVideoTextureView(textureView);
您还可以Surface
从 a创建一个SurfaceTexture
您可以通过TextureView
的setSurfaceTextureViewListener()
. 请参阅TextureView 的文档和这篇文章。然后你可以调用setSurface(...)
播放器。
SimpleExoPlayer
但是现在有了setter ,你真的不需要再这样做了TextureView
(我们在旧的 ExoPlayer 中并不总是有这个)。同样作为另一个参考,这里是ExoPlayer关于支持这一点的问题。
作为旁注,您可以在此处SurfaceView
查看和之间的区别。一般建议使用 a ,但有细微差别。TextureView
SurfaceView
[编辑]
如果您想即时执行此操作,您可以像我上面写的那样实例化SimpleExoPlayer
(not ),然后调用您的(您可以在 XML 中定义或动态定义)。SimpleExoPlayerView
setPlayer(...)
PlayerView
如果您不需要动态设置表面/纹理视图,那么您可以PlayerView
通过在布局 XML 中设置它app:surface_type="texture_view"
。
注意,TextureView
只能在硬件加速窗口中使用。在软件中渲染时,TextureView 不会绘制任何内容。所以在设置表面类型之后
<com.google.android.exoplayer2.ui.PlayerView android:id="@+id/player_view"
app:surface_type="texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
您需要确保启用了硬件加速,转到清单文件并添加此行
- 在应用程序级别:
<application android:hardwareAccelerated="true" ...>