Table des matières
Analytique
Légendes
Sécurité du contenu (DRM)
Diffusion en direct
Relecture
- Détection de la bande passante du réseau
- Obtenir l'instance ExoPlayer
- Lecture hors ligne avec DRM
- Pagination avec l'API de lecture
- Lecture de vidéos locales
- Réglage de la taille du tampon
- Réglage du débit binaire de pointe
- Réglage de la vitesse de lecture
- Paramétrer le mode lunettes VR pour les vidéos 360°
- Lancer la lecture au milieu d'une vidéo
- Échanger des vidéos
Contrôles du joueur
Listes de lecture
Contenu vidéo
Personnalisation des commandes pour Android TV
Vous pouvez ajouter des boutons à la barre de contrôle pour les appareils ou Android TV. Les étapes ci-dessous vous guident tout au long de l'ajout d'un bouton plein écran à la barre de contrôle pour Android TV :
- Ouvrez le Contrôles personnalisés exemple d'application. Nous utiliserons cela comme point de départ. Examinez les exemples d'applications LISEZ-MOI fichier pour plus de détails sur la personnalisation des commandes du lecteur.
- Ouvrez le res/layout/land/my_media_controller.xml fichier dans Android Studio.
- Copiez le
Button
élément pour lefull_screen
bouton. Le code devrait ressembler à ceci :<Button style="@style/BorderlessButton" android:id="@id/full_screen" android:padding="4dp" android:layout_gravity="center_vertical" android:layout_height="wrap_content" android:layout_width="wrap_content" android:visibility="visible" android:text="@string/brightcove_controls_enter_full_screen"/>
- Ouvrez le res/layout/my_tv_media_controller.xml fichier dans Android Studio.
- Coller le copié
Button
élément dans ce fichier de mise en page. La position des éléments détermine leur position dans la barre de contrôle. - Faites défiler vers le haut de la res/layout/my_tv_media_controller.xml déposer. Assurez-vous que la propriété style est définie sur
@style/BrightcoveControlBar.TV.Custom
. Le code doit ressembler à ceci :<?xml version="1.0" encoding="utf-8"?> <com.brightcove.player.mediacontroller.BrightcoveControlBar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bmc="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:ignore="Overdraw, InconsistentLayout" android:id="@+id/brightcove_control_bar" android:background="@color/bmc_background" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="8dp" android:orientation="horizontal" android:layout_gravity="bottom" style="@style/BrightcoveControlBar.TV.Custom">
- Ouvrez le res/valeurs/styles.xml fichier dans Android Studio.
- À l'
style
élément dont laname
valeur estBrightcoveControlBar.TV.Custom
, ajoutez unitem
élément pour le bouton plein écran et réglez-letrue
pour qu'il s'affiche.<style name="BrightcoveControlBar.TV.Custom"> <item name="brightcove_vr_mode">false</item> <item name="brightcove_full_screen">true</item> </style>
- C'est ça. Exécutez l'exemple d'application sur un appareil physique ou virtuel Android TV. Vous devriez voir le bouton plein écran dans la barre de contrôle.
Mode plein écran
Vous pouvez gérer le mode plein écran à l'aide de code.
-
Voici le code pour définir le mode plein écran :
brightcoveVideoView.getEventEmitter().emit(EventType.ENTER_FULL_SCREEN);
-
Voici le code pour quitter le mode plein écran :
brightcoveVideoView.getEventEmitter().emit(EventType.EXIT_FULL_SCREEN);
Obtenir la durée des diffusions en direct
Pour obtenir la durée d'une diffusion en direct, vous pouvez utiliser le MAX_POSITION
. Cela vous donne la plus grande position de recherche pour un flux en direct (c'est-à-dire le plus loin que vous puissiez faire glisser la barre de défilement). Votre code doit ressembler à ceci :
brightcoveVideoView.getEventEmitter().on(EventType.PROGRESS, new EventListener() {
@Override
public void processEvent(Event event) {
int duration = (int) event.properties.get(Event.MAX_POSITION);
}
});
Détection de la bande passante du réseau
Il peut y avoir des cas d'utilisation où vous devez détecter la bande passante du réseau au sein de votre application, par exemple lorsque vous travaillez avec des téléchargements.
Pour détecter la bande passante, le SDK natif pour Android utilise le BandwidthMeter
classe fournie par ExoPlayer. Notre PlayerBandwidthMeter
la classe utilise le BandwidthMeter
classe et fournit le getBitrateEstimate
méthode renvoyant le débit binaire estimé.
Pour plus de détails, voir les points suivants :
- Classe Brightcove PlayerBandwidthMeter
- Publier : Utilisation simplifiée du compteur de bande passante
- Interface du compteur de bande passante ExoPlayer
- Interface ExoPlayer BandwidthMeter.EventListener
Voici un exemple :
ExoPlayerVideoDisplayComponent exoPlayer = (ExoPlayerVideoDisplayComponent) brightcoveVideoView.getVideoDisplay();
exoPlayer.getBandwidthMeter().addEventListener(myHandler, new BandwidthMeter.EventListener() {@
Override public void onBandwidthSample(int elapsedMs, long bytesTransferred, long bitrateEstimate) {}
});
Obtenir l'instance ExoPlayer
Il peut arriver que vous deviez demander à l'objet ExoPlayer de modifier des propriétés qui ne sont pas exposées via le Brightcove Native SDK. Une instance de cet objet est créée une fois la vidéo définie. Il faut donc attendre la DID_SET_VIDEO
un événement.
Vous pouvez obtenir l'instance ExoPlayer en procédant comme suit :
// Get the ExoPlayer instance
eventEmitter.on(EventType.DID_SET_VIDEO, new EventListener() {
@Override
public void processEvent(Event event) {
VideoDisplayComponent videoDisplayComponent = brightcoveVideoView.getVideoDisplay();
if (videoDisplayComponent instanceof ExoPlayerVideoDisplayComponent) {
// Get ExoPlayer
ExoPlayer exoPlayer = ((ExoPlayerVideoDisplayComponent) videoDisplayComponent).getExoPlayer();
if (exoPlayer instanceof SimpleExoPlayer) {
// Get SimpleExoPlayer
SimpleExoPlayer simpleExoPlayer = (SimpleExoPlayer) exoPlayer;
Log.v(TAG, "onDID_SET_VIDEO: ExoPlayer = " + simpleExoPlayer);
}
}
}
});
Pour un exemple de modification du AudioAttribute
propriété pour l'ExoPlayer, voir la Définition des attributs audio sur l'instance Exoplayer message du forum.
Obtenir l'URL pour les images miniatures
Vous pouvez utiliser les vignettes ou les images fixes vidéo de votre bibliothèque Brightcove. Utilisez le code suivant pour obtenir l'URL de vos images :
Pour les clients Video Cloud utilisant le catalogue Edge (com.brightcove.player.edge.Catalog), vous pouvez obtenir l'URL de la vignette comme ceci :
String thumbnailUrl = video.getProperties().get("thumbnail").toString();
Si vous trouvez que l'image miniature est trop petite, vous pouvez obtenir l'image fixe de la vidéo à la place :
String videoStillUrl = video.getProperties().get("stillImageUri").toString();
Google Analytics
Si vous utilisez le lecteur Brightcove et la classe de catalogue, les analyses vidéo seront automatiquement collectées et apparaîtront dans votre module Video Cloud Analytics. Pour des métriques supplémentaires, vous pouvez ajouter Google Analytics à votre application.
Pour intégrer Google Analytics à votre application, procédez comme suit :
- Ajoutez le plug-in Google Services à votre projet.
- Obtenez un fichier de configuration Google et ajoutez-le à votre projet.
- Étendez l'application et fournissez une méthode d'assistance qui renvoie votre suivi d'applications. Il devrait ressembler au google-services AnalyticsApplication.
- Dans une classe distincte qui étend le BrightcovePlayer, obtenez l'instance de suivi partagé :
// Obtain the shared Tracker instance AnalyticsApplication application = (AnalyticsApplication) getApplication(); tracker = application.getDefaultTracker();
- Remplacez les méthodes appropriées pour consigner les changements d'écran et/ou envoyer des événements personnalisés pour le suivi.
Pour les étapes détaillées, consultez le document de Google pour Ajouter Analytics à votre application Android.
Chargement d'une vidéo à distance et d'une image d'affiche
Seuls les clients de Brightcove Player utilisent les ressources vidéo d'un serveur distant. Suivez ces étapes pour charger une vidéo et une image d'affiche, toutes deux résidant sur un serveur distant :
-
Dans le
onCreate()
méthode, après avoir défini la vue vidéo, créez un objet vidéo à partir de votre vidéo hébergée sur un serveur distant. Met leDeliveryType
pour correspondre au type de vidéo que vous avez.Video video = Video.createVideo("https://sdks.support.brightcove.com/assets/videos/hls/greatblueheron/greatblueheron.m3u8", DeliveryType.HLS);
-
Chargez une image distante à utiliser comme image d'affiche avant le démarrage de la lecture vidéo.
try { java.net.URI myposterImage = new java.net.URI("https://solutions.brightcove.com/bcls/assets/images/Great-Blue-Heron.png"); video.getProperties().put(Video.Fields.STILL_IMAGE_URI, myposterImage); } catch (URISyntaxException e) { e.printStackTrace(); }
-
Ajoutez la vidéo à la vue et lancez la lecture de la vidéo.
brightcoveVideoView.add(video); brightcoveVideoView.start();
-
Assurez-vous que votre
onCreate()
méthode s'affiche comme suit :@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); brightcoveVideoView = (BrightcoveExoPlayerVideoView) findViewById(R.id.brightcove_video_view); // Optional: For Brightcove Player customers to register their apps Analytics analytics = brightcoveVideoView.getAnalytics(); analytics.setAccount("your account Id"); // Define a video from a remote server Video video = Video.createVideo("https://sdks.support.brightcove.com/assets/videos/hls/greatblueheron/greatblueheron.m3u8", DeliveryType.HLS); // Load a remote poster image try { java.net.URI myposterImage = new java.net.URI("https://solutions.brightcove.com/bcls/assets/images/Great-Blue-Heron.png"); video.getProperties().put(Video.Fields.STILL_IMAGE_URI, myposterImage); } catch (URISyntaxException e) { e.printStackTrace(); } // Add video to the view brightcoveVideoView.add(video); // Start video playback brightcoveVideoView.start(); }
Ajout manuel de contenu DRM
En tant que client Brightcove Player, vous souhaiterez peut-être utiliser le contenu protégé par DRM de votre propre serveur. Vous pouvez charger manuellement le contenu DRM comme suit :
import com.brightcove.player.display.WidevineMediaDrmCallback;
Video video = Video.createVideo("https://storage.googleapis.com/wvmedia/cenc/h264/tears/tears.mpd");
video.getProperties().put(WidevineMediaDrmCallback.DEFAULT_URL, "https://proxy.uat.widevine.com/proxy?video_id=&provider=widevine_test");
brightcoveVideoView.add(video);
brightcoveVideoView.start();
Méthodes : synchrones ou asynchrones ?
Voici quelques-unes des méthodes asynchrones trouvées dans le kit de développement logiciel Native Player pour Android :
- Le
start()
,seekTo()
etstopPlayback()
Les méthodes sont asynchrones, car elles émettent un événement que d'autres composants du système doivent gérer. - Les
clear()
La méthode est synchrone par rapport à la mise à jour de la liste, mais elle est asynchrone par rapport au déchargement de la vidéo actuelle.
Activer/désactiver le son du lecteur
Vous pouvez désactiver ou réactiver le son du lecteur par programmation. Brightcove recommande d'utiliser le BrightcoveExoPlayerVideoView dans la mesure du possible.
BrightcoveExoPlayerVidéoVoir
Lorsque vous utilisez BrightCoveExoPlayerVideoView, vous pouvez désactiver ou réactiver le son du lecteur par programme en procédant comme suit :
float volume = 100F;
...
brightcoveVideoView.getEventEmitter().on(EventType.DID_SET_VIDEO, new EventListener() {
@Override
public void processEvent(Event event) {
setMute(true);
brightcoveVideoView.start();
}
});
...
private void setMute(boolean mute) {
volume = mute ? 0F : 100F;
Map<string, Object> properties = new HashMap<>();
properties.put(Event.VOLUME, volume);
brightcoveVideoView.getEventEmitter().emit(EventType.SET_VOLUME, properties);
}
BrightcoveVidéoVoir
Si vous devez utiliser le BrightCoveVideoView, qui utilise le MediaPlayer d'Android, vous pouvez désactiver ou réactiver le lecteur par programme à l'aide du code suivant :
float volume = 1F;
...
brightcoveVideoView.getEventEmitter().on(EventType.DID_SET_VIDEO, new EventListener() {
@Override
public void processEvent(Event event) {
setMute(true);
brightcoveVideoView.start();
}
});
...
private void setMute(boolean mute) {
volume = mute ? 0F : 1F;
Map<String, Object> properties = new HashMap<>();
properties.put(Event.LEFT_VOLUME, volume);
properties.put(Event.RIGHT_VOLUME, volume);
brightcoveVideoView.getEventEmitter().emit(EventType.SET_VOLUME, properties);
}
Lecture hors ligne avec DRM
Pour les vidéos téléchargées pour une lecture hors ligne, l'état du téléchargement peut également être affiché dans la zone de notification. Le titre de la notification est défini sur le titre de la vidéo. La notification est supprimée si le téléchargement est interrompu ou annulé.
Statut de téléchargement | Texte du contenu de la notification | Icône de notification |
---|---|---|
Téléchargement | R.string.odrm_download_running - c'est « Téléchargement... » par défaut. Une barre de progression indiquant le pourcentage d'achèvement s'affichera. |
L'icône de « téléchargement » animée par défaut de la plateforme - android.R.drawable.stat_sys_download |
Réessayez | R.string.odrm_download_waiting_retry - c'est « En attente d'une nouvelle tentative... « par défaut |
|
Échoué | R.string.odrm_download_failed - c'est « Failed ! « » par défaut |
|
Complété | R.string.odrm_download_complete - c'est « Enregistré » par défaut |
L'icône statique « téléchargée » par défaut de la plateforme - android.R.drawable.stat_sys_download_done |
Pour un statut Retry ou Failed, le sous-texte de notification sera défini sur une ressource appropriée en fonction du type d'erreur. Voici la liste complète :
R.string.odrm_error_none
R.string.odrm_error_cannot_resume
R.string.odrm_error_device_not_found
R.string.odrm_error_file_already_exists
R.string.odrm_error_file_error
R.string.odrm_error_http_data_error
R.string.odrm_error_insufficient_space
R.string.odrm_error_too_many_redirects
R.string.odrm_error_unhandled_http_code
R.string.odrm_error_unknown
Pagination avec l'API de lecture
Lors de la récupération de votre contenu Video Cloud à partir de l'API de lecture, vous pouvez implémenter la pagination pour une liste de lecture.
Pour parcourir un ensemble de vidéos dans une playlist, utilisez les paramètres d'URL de requête suivants :
limit
- définit le nombre de vidéos à renvoyer depuis l'API Playbackoffset
- définit le nombre de vidéos à ignorer dans une playlist depuis l'API Playback
Les paramètres de la requête seront passés à la méthode Catalog en tant que Map
objet, sous forme de paires clé-valeur. Cet exemple renvoie 6 vidéos en commençant par la 10e vidéo de la playlist :
Map<String, String> queryParameters = new HashMap<>();
queryParameters.put("limit", "6");
queryParameters.put("offset", "9");
Catalog catalog = new Catalog(eventEmitter, "myAccount", "myPolicy");
catalog.findPlaylistByID("myPlaylistId", null, queryParameters, myListener);
Lecture de vidéos locales
Si vous souhaitez lire des vidéos MP4 stockées localement, vous devez les enregistrer dans le dossier des ressources de l'application.
Uri video = Uri.parse("file:///android_asset/path/to/video.mp4");
brightcoveVideoView.add(Video.createVideo(video.toString()));
brightcoveVideoView.start();
Positionnement des commandes du lecteur en bas
Par défaut, la barre de contrôle du lecteur est positionnée directement sous la vidéo, comme illustré ici :
Vous pouvez également positionner la barre de contrôle du lecteur de manière à ce qu'elle se trouve en bas de la vue vidéo. Comme les commandes font partie de BrightcoveVideoView
, en réglant la hauteur sur match_parent
, la vue couvrira la totalité de l'écran. Lorsque les commandes apparaissent en bas de la vue, la vidéo reste au milieu de la vue.
Vous pouvez le faire de deux manières. La première approche est la suivante :
- Ouvrez le main/res/values/style.xml fichier pour votre projet.
-
Ajoutez le code XML suivant :
<style name="BrightcoveControlBar" parent="BrightcoveControlBarDefault"> <item name="brightcove_align">false</item> </style>
Ou, vous pouvez utiliser le code dans le MainActivity.java dossier comme suit :
- Ouvrez le MainActivity.java fichier pour votre projet.
-
Après avoir obtenu l'émetteur d'événement, comme indiqué ici :
EventEmitter eventEmitter = brightcoveVideoView.getEventEmitter();
Ajoutez l'écouteur d'événement et le code suivants. Nous attendons après la
DID_SET_VIDEO
événement pour s'assurer que la barre de contrôle a été créée.eventEmitter.on(EventType.DID_SET_VIDEO, new EventListener() { @Override public void processEvent(Event event) { BrightcoveControlBar brightcoveControlBar = brightcoveVideoView.getBrightcoveMediaController().getBrightcoveControlBar(); brightcoveControlBar.setAlign(false); } });
Précharger les annonces IMA
Pour précharger des publicités à l'aide du SDK natif pour Android et du plugin IMA, utilisez la setEnablePreloading(true)
propriété.
Pour utiliser cette propriété, procédez comme suit :
-
Le point de départ est le Exemple d'application IMA.
-
Localisez le
private void setupGoogleIMA()
fonction. -
Ajoutez le bloc de code d'extrait avant la dernière ligne de code de la fonction.
ImaSdkSettings imaSdkSettings = sdkFactory.createImaSdkSettings(); AdsRenderingSettings adsRenderingSettings = ImaSdkFactory.getInstance().createAdsRenderingSettings(); adsRenderingSettings.setEnablePreloading(true);
-
Ajouter le
adsRenderingSettings
paramètre à la dernière ligne de code.googleIMAComponent = new GoogleIMAComponent(brightcoveVideoView, eventEmitter, true, adsRenderingSettings);
Chercher sans publicité
Vous pouvez utiliser le adsDisabled
propriété pour le VideoPlaybackController
pour désactiver la lecture des annonces pendant que vous recherchez une vidéo.
Pour utiliser cette fonctionnalité, procédez comme suit :
-
Obtenir le
VideoPlaybackController
exemple de laBrightcoveVideoView
.VideoPlaybackController playbackController = brightcoveVideoView.getPlaybackController();
-
Désactivez la lecture des annonces.
playbackController.setAdsDisabled(true);
- Recherchez la position temporelle souhaitée dans la vidéo actuelle.
-
Reprenez le comportement normal de l'annonce.
playbackController.setAdsDisabled(false);
Votre code devrait ressembler à ceci :
final VideoPlaybackController playbackController = brightcoveVideoView.getPlaybackController();
eventEmitter.on(EventType.VIDEO_DURATION_CHANGED, new EventListener() {
@Override
public void processEvent(final Event event) {
playbackController.setAdsDisabled(true);
brightcoveVideoView.seekTo(10000);
}
});
eventEmitter.on(EventType.DID_SEEK_TO, new EventListener() {
@Override
public void processEvent(final Event event) {
playbackController.setAdsDisabled(false);
}
});
Réglage de la taille du tampon
Vous pouvez envisager d'augmenter la longueur de la mémoire tampon pour éliminer la mise en mémoire tampon dans le lecteur si la livraison du segment suivant est retardée depuis le CDN. Mais, vous ne pourrez peut-être pas faire mieux manuellement que HLS le fait déjà.
HLS est conçu pour jouer tout de suite et perdre en qualité s'il ne peut pas suivre. De cette façon, il n'a pas besoin de précharger un tampon. S'il ne peut pas suivre, il chargera autant de vidéo que possible avec la meilleure qualité pour éviter toute interruption.
À partir du SDK natif pour Android v6.3.1, les classes suivantes ont été ajoutées au SDK pour l'implémentation d'ExoPlayer 2 :
LoadControlConfig
AllocatorConfig
Les valeurs définies dans ces classes sont utilisées pour créer l'ExoPlayer DefaultLoadControl
objet, qui est utilisé pour créer l'instance ExoPlayer. Les développeurs peuvent contrôler la taille du tampon comme suit :
-
Les
LoadControlConfig
etAllocatorConfig
les classes suivent les modèles Builder. Les valeurs que vous pouvez définir dans les deux classes reflètent les valeurs que vous pouvez définir dans leurs constructeurs.AllocatorConfig allocatorConfig = new AllocatorConfig.Builder().build(); LoadControlConfig loadControlConfig = new LoadControlConfig.Builder() .setAllocatorConfig(allocatorConfig) .setMinBufferMs(X) .setMaxBufferMs(Y) .build();
-
Les valeurs non définies dans le générateur utiliseront les valeurs par défaut. Utilisez le
ExoPlayerVideoDisplayerComponent.setLoadControlConfig()
méthode pour définir leLoadControlConfig
.brightcoveVideoView = (BrightcoveExoPlayerVideoView) findViewById(R.id.brightcove_video_view); ... ExoPlayerVideoDisplayComponent dc = (ExoPlayerVideoDisplayComponent) brightcoveVideoView.getVideoDisplay(); dc.setLoadControlConfig(loadControlConfig);
Définir des légendes et des thèmes
Actuellement, le BrightcoveCaptionPropertiesActivity
est défini dans le fichier manifeste du Brightcove Player SDK, les développeurs n'ont donc pas besoin de le spécifier dans leurs applications :
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.brightcove.player"
android:versionCode="1"
android:versionName="1.0">
<application>
<!-- If we don't register this Activity in the Manifest, apps using the SDK will crash when they try to access it. -->
<!-- During the app's build process, this manifest will be merged with the app-level one. -->
<activity android:name="com.brightcove.player.captioning.BrightcoveCaptionPropertiesActivity"/>
</application>
</manifest>
Les BrightcoveCaptionPropertiesActivity
héritera du thème par défaut de la plate-forme, tant que vous définissez des thèmes pour votre application au <activity>
level dans le manifeste de votre application.
Si vous définissez un seul thème d'application au <application>
niveau, puis le BrightcoveCaptionPropertiesActivity
héritera des propriétés de ce thème au niveau de l'application. Pour certains thèmes, cela peut donner à l'activité un aspect étrange ou même illisible.
Dans ces cas, vous devez spécifier le BrightcoveCaptionPropertiesActivity
dans votre propre manifeste et appliquez-y un thème, comme ceci :
<activity
android:name="com.brightcove.player.captioning.BrightcoveCaptionPropertiesActivity"
android:theme="@style/MyCustomCaptionSettingsTheme"/>
Définition des sous-titres par défaut
Si votre vidéo utilise des sous-titres en plusieurs langues, vous pouvez définir par programme une langue par défaut lorsque la lecture démarre. Votre code doit ressembler à ceci :
brightcoveVideoView.getEventEmitter().once(EventType.CAPTIONS_LANGUAGES, new EventListener() {
@Override
public void processEvent(Event event) {
brightcoveVideoView.setClosedCaptioningEnabled(true);
brightcoveVideoView.setSubtitleLocale("fr");
}
});
Utilisation de légendes dans le manifeste
Par défaut, un lecteur construit avec le SDK Native pour Android utilisera des légendes latérales. Ces sous-titres se trouvent dans l' text_tracks
objet de la réponse de l'API Playback.
Pour configurer le lecteur afin qu'il utilise des sous-titres intégrés au manifeste, la CAPTION_SOURCES
propriété doit être supprimée de l'objet Video :
if (video.getProperties().get(Video.Fields.CAPTION_SOURCES) != null) {
video.getProperties().remove(Video.Fields.CAPTION_SOURCES);
}
Réglage du débit binaire de pointe
Pour vous aider à implémenter un sélecteur de débit dans votre lecteur, vous pouvez utiliser le code suivant pour définir le débit maximal :
((ExoPlayerVideoDisplayComponent) videoView.getVideoDisplay()).setPeakBitrate(bitRate);
Réglage de la vitesse de lecture
L'ExoPlayer prend en charge le réglage de la vitesse de lecture pour les vidéos lues sur des appareils Android. Pour plus de détails, voir Google Lecture à vitesse variable avec ExoPlayer document.
Vous pouvez contrôler la vitesse de lecture avec le code suivant :
eventEmitter.on(EventType.DID_PLAY, new EventListener() {
@Override
public void processEvent(Event event) {
//Get instance of ExoPlayer2
ExoPlayerVideoDisplayComponent displayComponent = (ExoPlayerVideoDisplayComponent) brightcoveVideoView.getVideoDisplay();
ExoPlayer exoPlayer = displayComponent.getExoPlayer();
//Set playback speed
PlaybackParameters param = new PlaybackParameters(1.6f, 1.0f);
exoPlayer.setPlaybackParameters(param);
}
});
Paramétrer le mode lunettes VR pour les vidéos 360°
Lors de la lecture d'une vidéo à 360°, les utilisateurs peuvent sélectionner le bouton Vidéo 360 sur la barre de contrôle pour passer en mode Lunettes VR. Si vous utilisez soit le BrightcovePlayer
ou BrightcovePlayerFragment
activité, l'orientation de l'écran passera au paysage lorsque le mode Lunettes VR est activé.
Si vous utilisez une activité personnalisée, vous devrez ajouter les éléments suivants :
brightcoveVideoView.getEventEmitter().on(EventType.CHANGE_ORIENTATION, new EventListener() {
@Override
public void processEvent(Event event) {
int orientation = event.getIntegerProperty(Event.REQUESTED_ORIENTATION);
setRequestedOrientation(orientation);
}
});
Afficher/masquer les images fixes de la vidéo
Le comportement par défaut lors de la récupération de vidéos à partir de votre bibliothèque Video Cloud est d'afficher l'image fixe de la vidéo jusqu'à ce que la lecture commence.
Affichage de l'image fixe de la vidéo
Vous pouvez afficher la vidéo à tout moment en émettant un SET_VIDEO_STILL
événement avec un VIDEO_STILL
propriété définie sur l'URI de l'image fixe de la vidéo.
Masquer l'image fixe de la vidéo
Si vous lisez automatiquement la vidéo, vous souhaiterez peut-être masquer l'image fixe de la vidéo. Pour ce faire, vous pouvez écouter le SET_VIDEO_STILL
événement et empêcher le comportement par défaut comme suit :
brightcoveVideoView.getEventEmitter().on(EventType.SET_VIDEO_STILL, new EventListener() {
@Override
public void processEvent(Event event) {
event.preventDefault();
event.stopPropagation();
}
});
Affichage des commandes du lecteur
Par défaut, les commandes du lecteur disparaissent après quelques secondes. L'utilisateur peut afficher les commandes en appuyant sur la vidéo.
Si vous souhaitez que les commandes du lecteur restent affichées jusqu'à ce que l'utilisateur appuie sur la vidéo, vous pouvez désactiver la fonction de masquage automatique comme suit : (le code nécessaire est mis en surbrillance)
public class MainActivity extends BrightcovePlayer {
private BrightcoveMediaController controller;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
brightcoveVideoView = (BrightcoveExoPlayerVideoView) findViewById(R.id.brightcove_video_view);
controller = new BrightcoveMediaController(brightcoveVideoView);
controller.setShowHideTimeout(0);
super.onCreate(savedInstanceState);
Lancer la lecture au milieu d'une vidéo
Parfois, vous devrez peut-être démarrer la lecture quelque part au milieu de la vidéo. Pour ce faire, vous pouvez appeler BrightCoveVideoView.seekTo()
avant de commencer la lecture.
catalog.findVideoByID(getString(R.string.videoId), new VideoListener() {
@Override
public void onVideo(Video video) {
Log.v(TAG, "onVideo: video = " + video);
brightcoveVideoView.getEventEmitter().on(EventType.DID_SET_VIDEO, new EventListener() {
@Override
public void processEvent(Event event) {
brightcoveVideoView.seekTo(60000);
brightcoveVideoView.start();
}
});
brightcoveVideoView.add(video);
brightcoveVideoView.pause();
}
});
Échanger des vidéos
Cet exemple montre une approche pour échanger des vidéos dans le lecteur.
Utiliser des vidéos uniques
Depuis le clear()
méthode est asynchrone lors du déchargement de la vidéo actuelle, vous devez attendre avant d'ajouter une nouvelle vidéo au lecteur. Voici deux options.
-
Étant donné que le temps de récupérer une vidéo à partir de Video Cloud devrait éclipser le temps de mettre à jour la liste de lecture, vous pouvez essayer quelque chose comme ceci :
brightcoveVideoView.clear(); catalog.findVideoByID("123456789", new VideoListener() { @Override public void onVideo(final Video video) { brightcoveVideoView.add(video); brightcoveVideoView.start(); } });
-
Une autre approche consiste à attendre un événement :
catalog.findVideoByID("", new VideoListener() { @Override public void onVideo(final Video video) { eventEmitter.once(EventType.DID_CHANGE_LIST, new EventListener() { @Override public void processEvent(Event event) { brightcoveVideoView.add(video); brightcoveVideoView.start(); } }); brightcoveVideoView.clear(); } });
Utiliser une liste de lecture
Si vous travaillez avec une liste de lecture, gardez à l'esprit que l'appel du clear()
La méthode supprime tous les éléments de la liste de lecture. Ainsi, vous pouvez obtenir un IndexOutOfBounds
exception lorsque vous essayez de passer à la première vidéo de la liste de lecture.
Au lieu de cela, vous pouvez essayer quelque chose comme ceci :
brightcoveVideoView.pause();
brightcoveVideoView.stopPlayback();
brightcoveVideoView.setCurrentIndex(0);
Basculer entre les vidéos d'une liste de lecture
Si vous utilisez une playlist, vous pouvez utiliser le code suivant pour basculer entre les vidéos de la playlist :
private void setupControls(List<Video> videos) {
previousVideoButton = (Button) findViewById(R.id.previous_video_button);
nextVideoButton = (Button) findViewById(R.id.next_video_button);
if (videos != null) {
previousVideoButton.setEnabled(false);
previousVideoButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
int index = brightcoveVideoView.getCurrentIndex();
int size = brightcoveVideoView.getList().size();
previousVideoButton.setEnabled(index > 1);
nextVideoButton.setEnabled((index + 1) < size);
if (index > 0) {
brightcoveVideoView.setCurrentIndex(index - 1);
}
}
});
nextVideoButton.setEnabled(videos.size() > 1);
nextVideoButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
int index = brightcoveVideoView.getCurrentIndex();
int size = brightcoveVideoView.getList().size();
previousVideoButton.setEnabled(index >= 0);
nextVideoButton.setEnabled((index + 2) < size);
if ((index + 1) < size) {
brightcoveVideoView.setCurrentIndex(index + 1);
}
}
});
}
}