我知道可以在ExoPlayer中使用TextureView。但我找不到任何关于如何以适当的方式实现此功能的示例。你能帮我解决这个问题吗?
答案 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)
如果您需要对播放器控件和呈现视频的
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);
您还可以从Surface
创建SurfaceTexture
,TextureView
setSurfaceTextureViewListener()
。请参阅TextureView's documentation和this post。然后你可以在播放器上拨打setSurface(...)
。
但是,SimpleExoPlayer
拥有TextureView
setter(我们在旧的ExoPlayer中并不总是这样),你不应该再这样做了。另外作为另一个参考,这里有the issue on ExoPlayer关于支持这个。
作为旁注,您可以看到SurfaceView
和TextureView
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" ...>