Sélection de légendes par programme avec le SDK natif pour Android

Dans cette rubrique, vous apprendrez comment sélectionner des sous-titres par programme lors de l'utilisation du SDK natif Brightcove pour Android.

Aperçu

Le SDK natif pour Android reçoit des sous-titres de l'un des éléments suivants :

  • Réponse du catalogue Brightcove (API de lecture) : Sidecar WebVTT
  • Manifeste vidéo (HLS ou DASH) : WebVTT dans le manifeste

Pour plus d'informations sur les sous-titres, consultez le Utilisation des sous-titres avec les SDK natifs Brightcove document.

Séquence d'événements

Le SDK natif suit cette séquence d'événements associée aux sous-titres :

  1. Récupérez une vidéo du catalogue Brightcove (c. catalog.findVideoByID()).

  2. Les sous-titres annexes sont analysés à partir de la réponse du catalogue et ajoutés aux propriétés de la vidéo.

  3. À ce stade, vous pouvez récupérer les sources de sous-titres comme suit :

    video.getProperties().get(Video.Fields.CAPTION_SOURCES);
  4. Définissez la vue vidéo. La vidéo est ajoutée à ExoPlayer.

    brightcoveVideoView.add(video);
  5. Le SDK natif obtient les sources de sous-titres et émet l'événement suivant :

    EventType.CAPTIONS_LANGUAGES
  6. Une fois la vidéo ajoutée à ExoPlayer, le SDK natif recherche les sous-titres dans le manifeste. Les sous-titres qui ne sont pas déjà présents dans les sources de sous-titres vidéo sont ajoutés. S'il existe de nouvelles sources de sous-titres, l'événement suivant est envoyé pour mettre à jour le contrôleur multimédia Brightcove.

    EventType.CAPTIONS_LANGUAGES

Sélectionnez les légendes

Suivez ces étapes pour sélectionner des sous-titres par programmation :

  1. Créez une méthode pour trouver une source de sous-titres spécifique avec le code de langue. Par exemple :

    private Pair<Uri, BrightcoveCaptionFormat> getCaptionsForLanguageCode(Video video, String languageCode) {
     Object payload = video == null ? null : video.getProperties().get(Video.Fields.CAPTION_SOURCES);
    
    if (payload instanceof List) {
     @SuppressWarnings("unchecked")
     List<Pair<Uri, BrightcoveCaptionFormat>> pairs =
        (List<Pair<Uri, BrightcoveCaptionFormat>>) payload;
    
     for (Pair<Uri, BrightcoveCaptionFormat> pair : pairs) {
       if (pair.second.language().equals(languageCode)) {
         return pair;
       }
     }
    }
    return null;
    }
  2. Notez que les sources de sous-titres sont dans Pair<Uri, BrightcoveCaptionFormat>. Les Uri dans la paire indique le type sous-titres codés :

    • Side-car: L'URL complète est présente
    • Dans le manifeste: Le BrightcoveCaptionFormat.BRIGHTCOVE_SCHEME est utilisé
  3. Créer une méthode chargée de sélectionner les sous-titres d'une vidéo avec un code de langue donné, en émettant le EventType.SELECT_CLOSED_CAPTION_TRACK un événement.

    private void selectCaption(Video video, String language) {
     Pair<Uri, BrightcoveCaptionFormat> pair = getCaptionsForLanguageCode(video, language);
    
    if (pair != null && !pair.first.equals(Uri.EMPTY)) {
     // BrightcoveCaptionFormat.BRIGHTCOVE_SCHEME indicates that is not a URL we need to load with the LoadCaptionsService, but instead we'll be enabled through a different component.
     if (!pair.first.toString().startsWith(BrightcoveCaptionFormat.BRIGHTCOVE_SCHEME)) {
       brightcoveVideoView.getClosedCaptioningController().getLoadCaptionsService().loadCaptions(pair.first, pair.second.type());
     }
     Map<String, Object> properties = new HashMap<>();
     properties.put(Event.CAPTION_FORMAT, pair.second);
     properties.put(Event.CAPTION_URI, pair.first);
     brightcoveVideoView.getEventEmitter().emit(EventType.SELECT_CLOSED_CAPTION_TRACK, properties);
    }
    }
  4. Écouter le EventType.CAPTIONS_LANGUAGES événement et sélectionnez la langue souhaitée par le code de langue.

    brightcoveVideoView.getEventEmitter().once(EventType.CAPTIONS_LANGUAGES, new EventListener() {
    @Override
    public void processEvent(Event event) {
     brightcoveVideoView.setClosedCaptioningEnabled(true);
    
      // You could find the desired language in the LANGUAGES list.
      // List<String> languages = event.getProperty(Event.LANGUAGES, List.class);
     selectCaption(brightcoveVideoView.getCurrentVideo(), "ja");
    }
    });