概要
Android 用ネイティブ SDK は、次のいずれかのキャプションを受け取ります。
- Brightcoveのカタログレスポンス (再生 API):サイドカーWebVTT
- ビデオマニフェスト(HLSまたはダッシュ):マニフェストの WebVTT
キャプションの詳細については、「 Brightcove ネイティブ SDK でキャプションを使用する」を参照してください。
イベントシーケンス
ネイティブ SDK は、キャプションに関連付けられた次のイベントシーケンスに従います。
-
Brightcoveのカタログから動画を取得する(例:
catalog.findVideoByID()
)。 -
サイドカーキャプションは、カタログ応答から解析され、ビデオプロパティに追加されます。
-
この時点で、次のようにキャプションソースを取得できます。
video.getProperties().get(Video.Fields.CAPTION_SOURCES);
-
ビデオビューを設定します。動画がExoPlayerに追加されます。
brightcoveVideoView.add(video);
-
ネイティブ SDK は、キャプションソースを取得し、次のイベントを発します。
EventType.CAPTIONS_LANGUAGES
-
ビデオが ExoPlayer に追加されると、ネイティブ SDK はマニフェスト内のキャプションを探します。ビデオキャプションソースにまだ存在しないキャプションが追加されます。新しいキャプションソースがある場合、次のイベントが送信されて Brightcove メディアコントローラを更新します。
EventType.CAPTIONS_LANGUAGES
キャプションを選択
プログラムでキャプションを選択するには、次の手順に従います。
-
言語コードを使用して特定のキャプションソースを検索するメソッドを作成します。例は次のとおりです。
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; }
-
キャプションソースがにあることに注意してください
Pair<Uri, BrightcoveCaptionFormat>
。Uri
ペアのは、クローズドキャプションの種類を示します。- サイドカー :完全なURLが存在する
- マニフェスト :BrightCoveCaptionFormat.BrightCove_scheme
-
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); } }
-
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 languaged in the LANGUAGES list. // List<String> languages = event.getProperty(Event.LANGUAGES, List.class); selectCaption(brightcoveVideoView.getCurrentVideo(), "ja"); } });