使用適用於Android的Native SDK以編程方式選擇字幕

在本主題中,您將學習在使用Brightcove Native SDK for Android時如何以編程方式選擇字幕。

概覽

適用於Android的Native SDK會從以下任意一個接收字幕:

  • Brightcove目錄響應(播放API):Sidecar WebVTT
  • 視頻清單(HLS或DASH):資訊清單內網路

有關字幕的更多信息,請參見在Brightcove本機SDK中使用字幕文件。

事件順序

本機SDK遵循與字幕相關的此事件序列:

  1. 從Brightcove目錄中檢索視頻(即catalog.findVideoByID())。

  2. 從目錄響應中解析Sidecar字幕,並將其添加到視頻屬性中。

  3. 此時,您可以按以下方式檢索字幕源:

    video.getProperties().get(Video.Fields.CAPTION_SOURCES);
  4. 設置視頻視圖。該視頻已添加到ExoPlayer。

    brightcoveVideoView.add(video);
  5. 本機SDK獲取字幕源並發出以下事件:

    EventType.CAPTIONS_LANGUAGES
  6. 將視頻添加到ExoPlayer後,本機SDK會查找清單內字幕。添加了視頻字幕源中尚不存在的所有字幕。如果有新的字幕源,則發送以下事件以更新Brightcove媒體控制器。

    EventType.CAPTIONS_LANGUAGES

選擇字幕

請按照以下步驟以編程方式選擇字幕:

  1. 創建一種方法來查找帶有語言代碼的特定字幕源。例如:

    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. 請注意,字幕源位於Pair<Uri, BrightcoveCaptionFormat>。的Uri配對中的表示字幕類型:

    • 邊車:完整的URL存在
    • 艙內:使用BrightcoveCaptionFormat.BRIGHTCOVE_SCHEME
  3. 通過發出帶有特定語言代碼的視頻,創建一種負責從視頻中選擇隱藏式字幕的方法EventType.SELECT_CLOSED_CAPTION_TRACK事件。

    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. EventType.CAPTIONS_LANGUAGES事件,然後通過語言代碼選擇所需的語言。

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