Extraits de code utilisant le SDK natif pour Android

Produit (s)
Lecteur Brightcove
Video Cloud
Les rôles)
Développeur SDK de périphérique
Les tâches)
Développer avec les SDK natifs
Les sujets)
Échantillons de code
Apis)
API de lecture
SDK
Android

Dans cette rubrique, vous trouverez une collection de fragments de code que vous pouvez trouver utile comme référence lors du développement avec le SDK. Pour des solutions plus détaillées, voir Échantillons de lecteur Android.

Table des matières

publicité
Analytics
Légendes
Concepts
Sécurité du contenu (DRM)
Flux en direct
Playback
Contrôles du joueur
Playlists
Le contenu vidéo

Personnalisation des contrôles 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 en ajoutant un bouton plein écran à la barre de contrôle pour Android TV:

  1. Ouvrez le Contrôles personnalisés exemple d'application Nous allons utiliser cela comme point de départ. Consultez l'exemple de l'application README fichier pour plus de détails sur la personnalisation des commandes du lecteur.
  2. Ouvrez le res / layout / land / mon_media_controller.xml fichier dans Android Studio.
  3. Copiez le Bouton élément pour le plein écran 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: texte = "@ chaîne / brightcove_controls_enter_full_screen" />
  4. Ouvrez le res / layout / mon_tv_media_controller.xml fichier dans Android Studio.
  5. Coller le copié Bouton élément dans ce fichier de mise en page. La position des éléments détermine leur position dans la barre de contrôle.
  6. Faites défiler vers le haut de la res / layout / mon_tv_media_controller.xml fichier. Assurez-vous que la propriété de style est définie sur @ style / BrightcoveControlBar.TV.Custom. Le code devrait 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 = "Outils http://schemas.android.com/tools": ignore = "Overdraw, InconsistentLayout" android: id = " @ + id / brightcove_control_bar "android: background =" @ couleur / bmc_background "android: layout_width =" match_parent "android: layout_height =" wrap_content "android: padding =" 8dp "android: orientation =" horizontale "android: layout_gravity =" bottom " style =" @ style / BrightcoveControlBar.TV.Custom ">
  7. Ouvrez le res / values ​​/ styles.xml fichier dans Android Studio.
  8. Au style élément avec un prénom valeur de BrightcoveControlBar.TV.Custom, ajoutez un le numéro d'article élément pour le bouton plein écran et le régler à vrai pour l'afficher.
    <style name = "BrightcoveControlBar.TV.Custom"> <nom de l'élément = "brightcove_vr_mode"> false </ item> <nom de l'élément = "brightcove_full_screen"> true </ item> </ style>
  9. C'est tout. Exécutez l'exemple d'application sur un périphérique physique ou virtuel Android TV. Vous devriez voir le bouton plein écran dans la barre de contrôle.
    Bouton plein écran
    Bouton plein écran

Obtenir la durée des diffusions en direct

Pour obtenir la durée d'un flux 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 pouvez faire glisser la barre de défilement). Votre code devrait ressembler à ceci:

brightcoveVideoView.getEventEmitter (). on (EventType.PROGRESS, nouvel EventListener () {@Overide public void processEvent (Evénement d'événement) {int duration = (int) event.properties.get (Event.MAX_POSITION);}});

Obtenir l'URL pour les images miniatures

Vous pouvez utiliser la vignette 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 miniature comme suit:

String thumbnailUrl = video.getProperties (). Get ("vignette"). ToString ();

Si vous trouvez que l'image miniature est trop petite, vous pouvez obtenir l'image fixe 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 ajouter des statistiques, vous pouvez ajouter Google Analytics à votre application.

Pour intégrer Google Analytics à votre application, procédez comme suit:

  1. Ajoutez le plug-in Google Services à votre projet.
  2. Obtenez un fichier de configuration Google et ajoutez-le à votre projet.
  3. Étendez l'application et fournissez une méthode d'assistance qui renvoie votre outil de suivi des applications. Il devrait ressembler à la google-services AnalyticsApplication.
  4. Dans une classe distincte qui étend le BrightcovePlayer, obtenez l'instance de suivi partagée:
    // Obtenir l'instance Tracker partagée Application AnalyticsApplication = (AnalyticsApplication) getApplication (); tracker = application.getDefaultTracker ();
  5. Remplacer les méthodes appropriées pour enregistrer les modifications de l'écran et / ou envoyer des événements personnalisés pour le suivi.

Pour les étapes détaillées, consultez le document de Google Ajouter des analyses à votre application Android.

Mode plein écran

Vous pouvez gérer le mode plein écran en utilisant le 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);

Ajouter manuellement du contenu DRM

En tant que client Brightcove Player, vous pouvez utiliser du contenu protégé par DRM depuis 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 (vidéo); brightcoveVideoView.start ();

Méthodes: synchrones ou asynchrones?

Voici quelques-unes des méthodes asynchrones trouvées dans le Native Player SDK pour Android:

  • Démarrer(), chercher à() et stopPlayback () Les méthodes sont asynchrones, car elles émettent un événement que les autres composants du système doivent gérer.
  • clair() La méthode est synchrone en ce qui concerne la mise à jour de la liste, mais elle est asynchrone en ce qui concerne le déchargement de la vidéo en cours.

Lecture hors ligne avec DRM

Pour les vidéos téléchargées en lecture hors connexion, 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 suspendu ou annulé.

Télécharger le statut de la notification
Télécharger statut 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

Il y aura une barre de progression montrant le pourcentage complété.
L'icône "Téléchargement" animée par défaut de la plateforme - android.R.drawable.stat_sys_download
Refaire R.string.odrm_download_waiting_retry - ceci est "Waiting retry ..." par défaut  
Échoué R.string.odrm_download_failed - c'est "Failed!" "par défaut  
terminé R.string.odrm_download_complete - Ceci 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 de Réessayer ou Échec, 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 Playback

Lorsque vous récupérez votre contenu Video Cloud à partir de l'API Playback, vous pouvez implémenter la pagination pour une playlist.

Pour parcourir un ensemble de vidéos dans une playlist, utilisez les paramètres d'URL de requête suivants:

  • limite - définit le nombre de vidéos à renvoyer depuis l'API Playback
  • décalage - définit le nombre de vidéos à ignorer dans une playlist de l'API Playback

Les paramètres de la requête seront transmis à la méthode Catalogue en tant que carte objet, en tant que paires clé-valeur. Cet exemple renvoie les vidéos 6 commençant par la vidéo 10th dans la playlist:,>

Mappe <String, String> queryParameters = new HashMap <> (); queryParameters.put ("limite", "6"); queryParameters.put ("offset", "9"); Catalogue catalogue = nouveau catalogue (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 ();

Chercher sans publicité

Vous pouvez utiliser le adsDisabled propriété pour la VideoPlaybackController Pour désactiver la lecture des annonces lorsque vous recherchez une vidéo.

Pour utiliser cette fonctionnalité, procédez comme suit:

  1. Obtenez le VideoPlaybackController instance de la BrightcoveVideoView.

    VideoPlaybackController playbackController = brightcoveVideoView.getPlaybackController ();
  2. Désactiver la lecture d'annonce

    playbackController.setAdsDisabled (true);
  3. Recherchez la position temporelle souhaitée dans la vidéo en cours.
  4. Reprendre 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, nouveau EventListener () {@Overide public void processEvent (événement final event) {lectureController.setAdsDisabled (true); brightcoveVideoView.seekTo (10000);}}); eventEmitter.on (EventType.DID_SEEK_TO, nouveau EventListener () {@Overide public void processEvent (événement final event) {playbackController.setAdsDisabled (false);}});

Réglage de la taille de la mémoire tampon

Vous pouvez envisager d'augmenter la longueur du tampon pour éliminer la mise en mémoire tampon dans le lecteur si la livraison du segment suivant est retardée par rapport au CDN. Mais vous ne pourrez peut-être pas faire mieux manuellement que HLS le fait déjà.

HLS est conçu pour jouer immédiatement et laisser tomber la qualité si elle 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 à la meilleure qualité pour éviter toute interruption.

Cela dit, si vous utilisez l'implémentation ExoPlayer 1, vous pouvez contrôler les éléments suivants:

Par exemple, si vous voulez définir la longueur du tampon à 120 secondes, vous pouvez définir minBufferMs to 120 * 1000.

Définition de légendes et de thèmes

Actuellement, la BrightcoveCaptionPropertiesActivity est défini dans le fichier manifeste de 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"?> <manifeste xmlns: android = "http://schemas.android.com/apk/res/android" package = "com.brightcove.player" android : versionCode = "1" android: versionNom = "1.0"> <application> <! - Si nous n'inscrivons pas cette activité dans le manifeste, les applications utilisant le SDK se bloqueront lorsqu'elles essaieront d'y accéder. -> <! - Au cours du processus de construction de l'application, ce manifeste sera fusionné avec celui de l'application. -> <activité android: name = "com.brightcove.player.captioning.BrightcoveCaptionPropertiesActivity" /> </ application> </ manifest>

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 <activité> niveau dans le manifeste de votre application.

Si vous définissez un thème d'application unique 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, l'activité peut sembler bizarre ou même illisible.

Dans ces cas, vous devez spécifier BrightcoveCaptionPropertiesActivity dans votre propre manifeste et y appliquer un thème, comme ceci:

<activity android: name = "com.brightcove.player.captioning.BrightcoveCaptionPropertiesActivity" android: theme = "@ style / MonCustomCaptionSettingsThème" />

Définir les légendes par défaut

Si votre vidéo utilise plusieurs sous-titres, vous pouvez définir une langue par défaut lors du démarrage de la lecture. Votre code devrait ressembler à ceci:

brightcoveVideoView.getEventEmitter (). une fois (EventType.CAPTIONS_LANGUAGES, new EventListener () {@Overide public void processEvent (Evénement d'événement) {brightcoveVideoView.setClosedCaptioningEnabled (true); brightcoveVideoView.setSubtitleLocale ("fr");}});

Réglage du débit 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 de pointe:

((ExoPlayerVideoDisplayComponent) videoView.getVideoDisplay ()). SetPeakBitrate (bitRate);

Réglage du mode VR Goggles pour les vidéos 360 °

Lors de la lecture d'une vidéo 360 °, les utilisateurs peuvent sélectionner le bouton Video 360 sur la barre de contrôle pour passer en mode VR Goggles. Si vous utilisez soit le BrightcovePlayer or BrightcovePlayerFragment l'activité de l'écran, l'orientation de l'écran passe en mode paysage lorsque le mode VR Goggles est activé.

Si vous utilisez une activité personnalisée, vous devrez ajouter ce qui suit:

brightcoveVideoView.getEventEmitter (). on (EventType.CHANGE_ORIENTATION, nouveau EventListener () {@Overide public void processEvent (Événement) {int orientation = événement.getIntegerProperty (Event.REQUESTED_ORIENTATION); setRequestedOrientation (orientation);}});

Affichage / masquage des images fixes vidéo

Le comportement par défaut lors de la récupération de vidéos de votre bibliothèque Video Cloud est d'afficher l'image fixe vidéo jusqu'à ce que la lecture commence.

Masquage de l'image fixe vidéo

Si vous exécutez la lecture vidéo en continu, vous pouvez masquer l'image fixe 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, nouvel EventListener () {@Overide public void processEvent (Événement) {event.preventDefault (); event.stopPropagation ();}});

Affichage de l'image fixe 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 la vidéo encore.

Commencer la lecture au milieu d'une vidéo

Parfois, vous devrez peut-être commencer 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), nouveau VideoListener () {@Overide public void onVideo (vidéo vidéo) {Log.v (TAG, "onVideo: video =" + vidéo); brightcoveVideoView.getEventEmitter (). on (EventType.DID_SET_VIDEO, nouveau EventListener () {@Overide public void processEvent (Evénement d'événement) {brightcoveVideoView.seekTo (60000); brightcoveVideoView.start ();}}); brightcoveVideoView.add (vidéo); brightcoveVideoView.pause () ;}});

Échanger des vidéos

Cet exemple montre une approche pour permuter des vidéos dans le lecteur.

Utilisation de vidéos uniques

Depuis l' clair() La méthode est asynchrone lors du déchargement de la vidéo en cours, vous devez attendre avant d'ajouter une nouvelle vidéo au lecteur. Voici deux options.

  • Étant donné que le temps d'aller chercher une vidéo à partir de Video Cloud devrait faire oublier le temps de mettre à jour la liste de lecture, vous pouvez essayer quelque chose comme ceci:

    brightcoveVideoView.clear (); catalog.findVideoByID ("123456789", nouveau VideoListener () {@Overide public void onVideo (vidéo finale vidéo) {brightcoveVideoView.add (vidéo); brightcoveVideoView.start ();}});
  • Une autre approche consiste à attendre un événement:

    catalog.findVideoByID ("", new VideoListener () {@Oublide public void onVideo (vidéo vidéo finale) {eventEmitter.once (EventType.DID_CHANGE_LIST, new EventListener () {@Oublide public void processEvent (Evénement d'événement) {brightcoveVideoView.add ( vidéo); brightcoveVideoView.start ();}}); brightcoveVideoView.clear ();}});

Utiliser une playlist

Si vous travaillez avec une playlist, gardez à l'esprit que l'appel du clair() méthode supprime tous les éléments de la playlist. Donc, vous pouvez obtenir un IndexOutOfBounds exception lorsque vous essayez de passer à la première vidéo de la playlist.

Au lieu de cela, vous pouvez essayer quelque chose comme ceci:

brightcoveVideoView.pause (); brightcoveVideoView.stopPlayback (); brightcoveVideoView.setCurrentIndex (0);

Passer d'une vidéo à une playlist

Si vous utilisez une playlist, vous pouvez utiliser le code suivant pour basculer entre les vidéos de la playlist:

private void setupControls (Liste <vidéos> vidéos) {previousVideoButton = (Bouton) findViewById (R.id.previous_video_button); nextVideoButton = (Bouton) findViewById (R.id.next_video_button); if (videos! = null) {previousVideoButton.setEnabled (faux); previousVideoButton.setOnClickListener (new View.OnClickListener () {public void onClick (Voir la vue) {int index = brightcoveVideoView.getCurrentIndex (); int taille = brightcoveVideoView.getList (). size (); previousVideoButton.setEnabled (index> 1); nextVideoButton.setEnabled ((index + 1) <taille); if (index> 0) {brightcoveVideoView.setCurrentIndex (index - 1);}}}); nextVideoButton.setEnabled (videos.size ()> 1); nextVideoButton.setOnClickListener (new View.OnClickListener () {public void onClick (Voir la vue) {int index = brightcoveVideoView.getCurrentIndex (); int taille = brightcoveVideoView.getList (). size (); previousVideoButton.setEnabled (index> = 0) ; nextVideoButton.setEnabled ((index + 2) <taille); if ((index + 1) <taille) {brightcoveVideoView.setCurrentIndex (index + 1);}}}); }}

Travailler avec le contrôle du volume

Vous pouvez couper ou réactiver le lecteur par programmation. Brightcove recommande d'utiliser BrightcoveExoPlayerVideoView autant que possible.

BrightcoveExoPlayerVidéoView

Lorsque vous utilisez le BrightcoveExoPlayerVidéoView, vous pouvez couper ou réactiver le lecteur par programmation en procédant comme suit:

volume flottant = 100; ... brightcoveVideoView.getEventEmitter (). on (EventType.DID_SET_VIDEO, nouvelle EventListener () {@Overide public void processEvent (Evénement d'événement) {setMute (true); brightcoveVideoView.start ();}}); ... private void setMute (booléen muet) {volume = muet? 0: 100; Carte  propriétés = new HashMap <> (); properties.put (Event.VOLUME, volume); brightcoveVideoView.getEventEmitter (). emit (EventType.SET_VOLUME, propriétés); }  ,>

BrightcoveVideoView

Si vous devez utiliser le BrightcoveVideoView, qui utilise Android Lecteur multimédia, vous pouvez couper ou réactiver le lecteur par programmation avec le code suivant:

volume flottant = 100; ... brightcoveVideoView.getEventEmitter (). on (EventType.DID_SET_VIDEO, nouvelle EventListener () {@Overide public void processEvent (Evénement d'événement) {setMute (true); brightcoveVideoView.start ();}}); ... private void setMute (booléen muet) {volume = muet? 0: 1; Mappe <String, Object> properties = new HashMap <> (); properties.put (Event.LEFT_VOLUME, volume); properties.put (Event.RIGHT_VOLUME, volume); brightcoveVideoView.getEventEmitter (). emit (EventType.SET_VOLUME, propriétés); }