Selección de subtítulos mediante programación con el SDK nativo para Android

En este tema, aprenderá cómo seleccionar subtítulos mediante programación cuando utilice Brightcove Native SDK para Android.

Resumen

El SDK nativo para Android recibe subtítulos de cualquiera de los siguientes:

  • Respuesta del catálogo de Brightcove (API de reproducción): Sidecar WebVTT
  • Manifiesto de video (HLS o DASH): WebVTT en manifiesto

Para obtener más información sobre los subtítulos, consulte la Uso de subtítulos con los SDK nativos de Brightcove documento.

Secuencia de eventos

El SDK nativo sigue esta secuencia de eventos asociada con los subtítulos:

  1. Recupere un video del catálogo de Brightcove (p. Ej. catalog.findVideoByID()).

  2. Los subtítulos de sidecar se analizan a partir de la respuesta del catálogo y se agregan a las propiedades del video.

  3. En este punto, puede recuperar las fuentes de subtítulos de la siguiente manera:

    video.getProperties().get(Video.Fields.CAPTION_SOURCES);
  4. Configura la vista de video. El video se agrega a ExoPlayer.

    brightcoveVideoView.add(video);
  5. El SDK nativo obtiene fuentes de subtítulos y emite el siguiente evento:

    EventType.CAPTIONS_LANGUAGES
  6. Una vez que el video se agrega a ExoPlayer, el SDK nativo busca subtítulos en el manifiesto. Se agregan todos los subtítulos que no estén presentes en las fuentes de subtítulos del video. Si hay nuevas fuentes de subtítulos, se envía el siguiente evento para actualizar el controlador de medios Brightcove.

    EventType.CAPTIONS_LANGUAGES

Seleccionar subtítulos

Siga estos pasos para seleccionar subtítulos mediante programación:

  1. Cree un método para encontrar una fuente de subtítulos específica con el código de idioma. Por ejemplo:

    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. Tenga en cuenta que las fuentes de subtítulos están en Pair<Uri, BrightcoveCaptionFormat>. La Uri en el par indica el tipo de subtítulos cerrados:

    • Sidecar: La URL completa está presente
    • En manifiesto: Se utiliza BrightcoveCaptionFormat.BRIGHTCOVE_SCHEME
  3. Cree un método responsable de seleccionar subtítulos de un video con un código de idioma dado, emitiendo el EventType.SELECT_CLOSED_CAPTION_TRACK evento.

    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. Escuchar a la EventType.CAPTIONS_LANGUAGES evento y seleccione el idioma deseado por el código de idioma.

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