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 的 @ 设置播放器的目标 SurfaceViewTextureViewSurfaceHolderSurface分别为 987654331@、setVideoTextureViewsetVideoSurfaceHoldersetVideoSurface 方法。

所以这里的相关部分是setVideoTextureView()。比如:

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

您还可以从SurfaceTexture 创建一个Surface,您可以通过TextureViewsetSurfaceTextureViewListener() 获得该Surface。请参阅 TextureView's documentation 和 this post。然后你可以在播放器上调用setSurface(...)

但是现在SimpleExoPlayer 拥有TextureView 设置器(我们在旧的ExoPlayer 中并不总是有这个),你真的不需要再这样做了。作为另一个参考,这里是 the issue on ExoPlayer 关于支持这一点。

作为旁注,您可以看到SurfaceViewTextureView 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_/>

您需要确保启用了硬件加速,转到清单文件并添加此行

在应用程序级别:&lt;application android:hardwareAccelerated="true" ...&gt;

【讨论】:

以上是关于ExoPlayer的PlayerView如何使用TextureView而不是SurfaceView?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Exoplayer 播放从 Mediastore 获取的视频

PagerAdapter 总是在 ViewPager 中被调用两次

如何使用 ExoPlayer 的 IMA 扩展在特定点展示广告?

如何将 RTSP 视频 url 播放到 EXOPlayer

如何使用 exoplayer 一起播放单独的音频和视频?

如何从 ExoPlayer Cast 扩展创建 CastPlayer?