The Player View
The Player View¶
This chapter covers some details and configuration options of the
PlayerView
, the main visual component that provides the surface
view for video playback.
Basic Integration¶
The PlayerView
is a visual Android component that you can add to your layouts.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
tools:context="com.castlabs.sdk.demos.SimplePlaybackDemo">
<com.castlabs.android.player.PlayerView
android:id="@+id/player_view"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.castlabs.android.player.PlayerView>
</FrameLayout>
The view supports two different surface types: the default SurfaceView
and
a TextureView
. This is configurable through an attribute setting in the
layout file:
<FrameLayout>
<com.castlabs.android.player.PlayerView
app:surface="textureView">
...
</com.castlabs.android.player.PlayerView>
</FrameLayout>
The possible values are textureView
to select a TextureView
or
surfaceView
to use a SurfaceView
.
Alternatively, you can also configure the surface type programmatically using
the view’s PlayerView.setSurfaceType(int)
method.
The surface type that you choose here has a direct implication on the
content that you can play. While a TextureView
integrates nicely
with other user interface elements and allows smooth animations and transitions,
it is not secure. If your DRM system enforces a secure media path, only the
SurfaceView
will be able to render video. In general, we encourage you to
always use the SurfaceView
setting, which is also the default, for playback
of DRM protected content.
Hiding the Surface¶
As mentioned before, SurfaceView
is required for DRM protected content
playback, but it is a heavy component that does not play nicely with other
components, specifically other SurfaceView
instances.
If you need to overlay another SurfaceView
over the current player, for
example when you are implementing ad insertion, the PlayerView
allows you
to hide or remove its current surface.
The best option is to use the view’s
PlayerView.setSurfaceVisibility(boolean)
method to hide or show the
current surface. This method will not remove the surface from the scene but
rather resize it to become invisible. This has the benefit that the surface
will not be detached from the player and, once made visible again, video
playback and video rendering will start immediately.
If you cannot use the PlayerView.setSurfaceVisibility(boolean)
method, or you want to completely detach and remove the surface, you can use
PlayerView.removeSurface()
and PlayerView.prepareSurface()
to remove and prepare a new surface. The downside of this method is that video
rendering can only continue at the next i-frame.
Scaling Mode¶
By default, the PlayerView
will scale its surface to match the aspect ratio
of the video. You can, however, change that using
PlayerView.setScalingMode(int)
. The supported modes are:
PlayerView.SCALING_MODE_FIT
This is the default mode. The video will be scaled using its original aspect ratio to fit inside the player view.
PlayerView.SCALING_MODE_CROP
The video will be displayed in its original size. If the video is larger than the screen size, any overflow will not be visible and cut off (“cropped”).
PlayerView.SCALING_MODE_STRETCH
The video will be scaled to fully utilize the available screen size. The original aspect ratio of the video will not be kept.
PlayerView Plugins¶
The PRESTOplay SDK for Android provides a set of PlayerViewPlugins
. These Plugins
act as an interface between some PlayerControllerPlugins
, such as the SubtitlesPlugin
or
the ThumbsPlugin
and a PlayerView
.
If you use one of such Plugins
, the corresponding PlayerViewPlugin
will also be enabled and
the PlayerView
will handle the creation and lifecycle of the required Views.
You can get access to the underlying Views created by the PlayerViewPlugins
and ultimately
used by the PlayerControllerPlugins
with the PlayerView.getComponentView(int)
method,
or through PlayerController.getComponentView(int)
.
If you want finer control over any of these Plugins
please check the corresponding section for
each plugin.