【发布时间】:2018-09-03 16:41:45
【问题描述】:
我知道可以在 ExoPlayer 中使用 TextureView。但我找不到任何关于如何以正确方式实现此功能的示例。你能帮我解决这个问题吗?
【问题讨论】:
标签: android exoplayer exoplayer2.x
我知道可以在 ExoPlayer 中使用 TextureView。但我找不到任何关于如何以正确方式实现此功能的示例。你能帮我解决这个问题吗?
【问题讨论】:
标签: android exoplayer exoplayer2.x
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_width="match_parent"
android:layout_height="match_parent"/>
【讨论】:
如果您需要对播放器控件和渲染视频的
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 上设置它。
【讨论】:
SimpleExoPlayer with TextureView。你的意思是SimpleExoPlayerView?如果您正在使用它,您可以在PlayerView 上调用setPlayer(),并确保播放器已经设置了TextureView。这有意义吗?
PlayerView 默认使用SurfaceView,通常不需要解决此问题。因此,如果它有效,那么您应该很好地使用SurfaceView。
注意,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" ...>
【讨论】: