8

我知道可以在 ExoPlayer 中使用 TextureView。但我找不到任何关于如何以正确方式实现此功能的示例。你能帮我解决这个问题吗?

4

3 回答 3

17

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"/>
于 2018-03-25T20:29:24.780 回答
6

文档中

如果您需要对播放器控件和渲染视频的对象进行细粒度控制,Surface可以分别设置播放器的目标SurfaceView、、或直接使用 SimpleExoPlayer 的、、和方法。TextureViewSurfaceHolderSurfacesetVideoSurfaceViewsetVideoTextureViewsetVideoSurfaceHoldersetVideoSurface

所以这里的相关部分是setVideoTextureView(). 就像是:

SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context, trackSelector);
TexturView textureView = findViewById(texture_view);
player.setVideoTextureView(textureView);

您还可以Surface从 a创建一个SurfaceTexture您可以通过TextureViewsetSurfaceTextureViewListener(). 请参阅TextureView 的文档这篇文章。然后你可以调用setSurface(...)播放器。

SimpleExoPlayer但是现在有了setter ,你真的不需要再这样做了TextureView(我们在旧的 ExoPlayer 中并不总是有这个)。同样作为另一个参考,这里是ExoPlayer关于支持这一点的问题。

作为旁注,您可以在此处SurfaceView查看和之间的区别。一般建议使用 a ,但有细微差别。TextureView SurfaceView

[编辑]

如果您想即时执行此操作,您可以像我上面写的那样实例化SimpleExoPlayer(not ),然后调用您的(您可以在 XML 中定义或动态定义)。SimpleExoPlayerViewsetPlayer(...)PlayerView

如果您不需要动态设置表面/纹理视图,那么您可以PlayerView通过在布局 XML 中设置它app:surface_type="texture_view"

于 2018-03-25T17:45:27.767 回答
2

注意,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" ...>
于 2020-06-24T19:44:19.850 回答