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

Eln*_*yev 4 android exoplayer exoplayer2.x

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

mar*_*ger 9

它PlayerView有一个xml属性surface_type,让你选择是否要使用a SurfaceView或a TextureView.

(注意:SimpleExoPlayerView已经PlayerView在最近的版本中重命名,因为它只依赖于Player界面而不再依赖于SimpelExoPlayerView.)

您可以选择texture_view,surface_view(默认)或none.有关详细信息,请参阅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"/>
Run Code Online (Sandbox Code Playgroud)


Kyl*_*enn 6

从文档:

如果您需要在播放器控制细粒度的控制和Surface在其上渲染视频,可以设置玩家的目标SurfaceView,TextureView,SurfaceHolder或者Surface使用SimpleExoPlayer的直接setVideoSurfaceView,setVideoTextureView,setVideoSurfaceHolder和setVideoSurface分别的方法。

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

SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context, trackSelector);
TexturView textureView = findViewById(texture_view);
player.setVideoTextureView(textureView);
Run Code Online (Sandbox Code Playgroud)

您还可以Surface从 a创建一个SurfaceTexture您可以通过TextureView的setSurfaceTextureViewListener()。请参阅TextureView 的文档和这篇文章。然后你可以打电话setSurface(...)给玩家。

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

作为一个侧面说明,你可以看到之间的差异SurfaceView,并TextureView 在这里。一般建议使用 a SurfaceView,但存在细微差别。

[编辑]

如果你想即时完成,你可以像我上面写的那样实例化SimpleExoPlayer(not SimpleExoPlayerView),然后调用setPlayer(...)你的PlayerView(你可以用 XML 或动态定义)。

如果您不需要即时设置表面/纹理视图,那么您只需PlayerView在布局 XML 中通过app:surface_type="texture_view".