如何使用TextureView而不是SurfaceView与ExoPlayer的PlayerView?

时间:2018-03-25 13:06:59

标签: android exoplayer exoplayer2.x

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

3 个答案:

答案 0 :(得分:8)

The PlayerView has an xml attribute surface_type which let's you choose whether you want to use a SurfaceView or a TextureView.

(Note: SimpleExoPlayerView has been renamed to PlayerView in recent versions since it only depends on the Player interface and not on SimpelExoPlayerView anymore.)

You can choose texture_view, surface_view (default) or none. See the main section of the JavaDoc of PlayerView for details.

<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"/>

答案 1 :(得分:4)

来自the documentation

  

如果您需要对播放器控件和呈现视频的Surface进行细粒度控制,您可以设置播放器的目标SurfaceViewTextureViewSurfaceHolderSurface分别直接使用SimpleExoPlayer的setVideoSurfaceViewsetVideoTextureViewsetVideoSurfaceHoldersetVideoSurface方法。

所以这里的相关部分是setVideoTextureView()。类似的东西:

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

您还可以从Surface创建SurfaceTextureTextureView setSurfaceTextureViewListener()。请参阅TextureView's documentationthis post。然后你可以在播放器上拨打setSurface(...)

但是,SimpleExoPlayer拥有TextureView setter(我们在旧的ExoPlayer中并不总是这样),你不应该再这样做了。另外作为另一个参考,这里有the issue on ExoPlayer关于支持这个。

作为旁注,您可以看到SurfaceViewTextureView here之间的差异。一般建议是使用SurfaceView,但有细微差别。

[编辑]

如果您想动态执行此操作,可以像上面写的那样实例化SimpleExoPlayer(不是SimpleExoPlayerView),然后在{setPlayer(...)上调用PlayerView {1}}(您可以使用XML或动态定义)。

如果您不需要动态设置表面/纹理视图,则可以通过PlayerView在布局XML中的app:surface_type="texture_view"上进行设置。

答案 2 :(得分:1)

请注意,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" ...>