【问题标题】:How to use TextureView instead of SurfaceView with PlayerView of ExoPlayer?ExoPlayer的PlayerView如何使用TextureView而不是SurfaceView?
【发布时间】:2018-09-03 16:41:45
【问题描述】:

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

【问题讨论】:

    标签: android exoplayer exoplayer2.x


    【解决方案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_width="match_parent"
         android:layout_height="match_parent"/>
    

    【讨论】:

    • 我的视频没有全屏播放?任何选项
    【解决方案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 documentationthis 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_width="match_parent"
     android:layout_height="match_parent"/>
    

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 2022-06-28
      • 2019-06-18
      • 1970-01-01
      • 2015-02-07
      • 2014-04-23
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      相关资源
      最近更新 更多