Extraits de code utilisant le SDK natif pour Android

Dans cette rubrique, vous trouverez une collection d'extraits de code qui peuvent vous être utiles comme référence lors du développement avec le SDK. Pour des solutions plus détaillées, consultez les exemples du lecteur Android.

Table des matières

Publicité

Analytique

Légendes

Concepts

Sécurité du contenu (DRM)

Diffusion en direct

Relecture

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 :

  1. 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.
  2. Ouvrez le res/layout/land/my_media_controller.xml fichier dans Android Studio.
  3. Copiez le Button élément pour le full_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"/>
  4. Ouvrez le res/layout/my_tv_media_controller.xml fichier dans Android Studio.
  5. 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.
  6. 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">
  7. Ouvrez le res/valeurs/styles.xml fichier dans Android Studio.
  8. À l' style élément dont la name valeur est BrightcoveControlBar.TV.Custom, ajoutez un item élément pour le bouton plein écran et réglez-le true 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>
  9. 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.
    Bouton plein écran
    Bouton plein écran

Mode plein écran

Vous pouvez gérer le mode plein écran à l'aide de code.

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 :

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 :

  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 suivi d'applications. Il devrait ressembler au google-services AnalyticsApplication.
  4. 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();
  5. 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 :

  1. 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 le DeliveryType 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);
  2. 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();
    }
  3. Ajoutez la vidéo à la vue et lancez la lecture de la vidéo.

    brightcoveVideoView.add(video);
    brightcoveVideoView.start();
  4. 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() et stopPlayback() 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é.

Télécharger l'état des notifications
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 Playback
  • offset- 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 :

Commandes du lecteur sous vidéo
Commandes du lecteur sous vidéo

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.

Commandes du joueur en bas
Le lecteur contrôle le bas de la vue vidéo

Vous pouvez le faire de deux manières. La première approche est la suivante :

  1. Ouvrez le main/res/values/style.xml fichier pour votre projet.
  2. 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 :

  1. Ouvrez le MainActivity.java fichier pour votre projet.
  2. 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 :

  1. Le point de départ est le Exemple d'application IMA.

  2. Localisez le private void setupGoogleIMA() fonction.

  3. 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);
  4. 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 :

  1. Obtenir le VideoPlaybackController exemple de la BrightcoveVideoView.

    VideoPlaybackController playbackController = brightcoveVideoView.getPlaybackController();
  2. Désactivez la lecture des annonces.

    playbackController.setAdsDisabled(true);
  3. Recherchez la position temporelle souhaitée dans la vidéo actuelle.
  4. 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 :

  1. Les LoadControlConfig et AllocatorConfig 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();
  2. 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 le LoadControlConfig.

    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.

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);
    }
  }
});
}
}