2017-12-11 32 views
0

Exoplayer、ExoMedia、または他のプレーヤーを使用してVimeoビデオに埋め込まれた異なる字幕をHLS形式で有効にする方法と選択する方法 iOSでは、これと同じビデオに既に字幕のオプションが表示されていますが、Androidでは実装方法が見つかりません。ExoplayerでHLS埋め込みキャプションを表示する方法

答えて

0

ここでの回答はthis oneとよく似ていますので、最初に確認してください。

ExoPlayerは、Androidに必要なライブラリです。字幕を表示するのは簡単ではありませんが、そのライブラリのdemo appには、HLSビデオで作業するために必要なすべてのコードが含まれています。より具体的には、PlayerActivityクラス。デモアプリケーションのHLS - > "Apple 16x9 basic stream"に行くことができ、そのビデオには1トンの字幕(別名「テキストトラック」)があります。

ちょうどヘルパーに依存しないようにコードを単純化しています(そして、それはどのように動作するのかを見ることができます)のクローズドキャプションで)私は以下のコードを書いています。あなたは彼らのinitializePlayer()メソッドの最後に次のコードを投稿した場合

private static class ClosedCaptionManager { 

    ClosedCaptionManager(MappingTrackSelector mappingTrackSelector, SimpleExoPlayer player) { 
     this.player = player; 
     this.trackSelector = mappingTrackSelector; 
    } 

    SimpleExoPlayer player; 
    MappingTrackSelector trackSelector; 

    // These two could be fields OR passed around 
    int textTrackIndex; 
    TrackGroupArray trackGroups; 

    ArrayList<Pair<Integer, Integer>> pairTrackList = new ArrayList<>(); 

    private boolean checkAndSetClosedCaptions() { 
     // This is the body of the logic for see if there are even video tracks 
     // It also does some field setting 
     MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); 
     if (mappedTrackInfo == null) { 
      return false; 
     } 
     for (int i = 0; i < mappedTrackInfo.length; i++) { 
      trackGroups = mappedTrackInfo.getTrackGroups(i); 
      if (trackGroups.length != 0) { 
       switch (player.getRendererType(i)) { 
        case C.TRACK_TYPE_TEXT: 
         textTrackIndex = i; 
         return true; 
       } 
      } 
     } 
     return false; 
    } 

    private void buildTrackList() { 
     // This next part is actually about getting the list. 
     // Below you'd be building up items in a list. This just does 
     // views directly, but you could just have a list of track names (with indexes) 
     for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) { 
      TrackGroup group = trackGroups.get(groupIndex); 
      for (int trackIndex = 0; trackIndex < group.length; trackIndex++) { 
       if (trackIndex == 0) { 
        // Beginning of a new set, the demo app adds a divider 
       } 
       //CheckedTextView trackView = ...; // The TextView to show in the list 
       // The below points to a util which extracts the quality from the TrackGroup 
       //trackView.setText(DemoUtil.buildTrackName(group.getFormat(trackIndex))); 
       Log.e("Thing", DemoUtil.buildTrackName(group.getFormat(trackIndex))); 
       pairTrackList.add(new Pair<>(groupIndex, trackIndex)); 
      } 
     } 
    } 

    private void onTrackViewClick(Pair<Integer, Integer> trackPair) { 
     // Assuming you tagged the view with the groupIndex and trackIndex, you 
     // can build your override with that info. 
     Pair<Integer, Integer> tag = trackPair; 
     int groupIndex = tag.first; 
     int trackIndex = tag.second; 
     // This is the override you'd use for something that isn't adaptive. 
     // `override = new SelectionOverride(FIXED_FACTORY, groupIndex, trackIndex);` 
     // Otherwise they call their helper for adaptives (HLS/DASH), which roughly does: 
     int[] tracks = getTracksAdding(new MappingTrackSelector.SelectionOverride(
         new FixedTrackSelection.Factory(), groupIndex, trackIndex), 
       trackIndex 
     ); 
     TrackSelection.Factory factory = tracks.length == 1 
       ? new FixedTrackSelection.Factory() 
       : new AdaptiveTrackSelection.Factory(BANDWIDTH_METER); 

     MappingTrackSelector.SelectionOverride override = 
       new MappingTrackSelector.SelectionOverride(factory, groupIndex, tracks); 

     // Then we actually set our override on the selector to switch the text track 
     trackSelector.setSelectionOverride(textTrackIndex, trackGroups, override); 
    } 

    private static int[] getTracksAdding(MappingTrackSelector.SelectionOverride override, int addedTrack) { 
     int[] tracks = override.tracks; 
     tracks = Arrays.copyOf(tracks, tracks.length + 1); 
     tracks[tracks.length - 1] = addedTrack; 
     return tracks; 
    } 
} 

その後、あなたは、これらの各部分を組み合わせる方法のアイデアを得るでしょう。

final ClosedCaptionManager closedCaptionManager = new ClosedCaptionManager(trackSelector, player); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      boolean hasTracks = closedCaptionManager.checkAndSetClosedCaptions(); 
      if (hasTracks) { 
       closedCaptionManager.buildTrackList(); 
       closedCaptionManager.onTrackViewClick(closedCaptionManager.pairTrackList.get(4)); 
      } 
     } 
    }, 2000); 

上記のコードは非常にうっすらですが、うまくいけば、少なくとも正しい方向に着手してください。私は書かれたものを使用することはお勧めしません - それは主に、どのように一緒に収まるかを知ることです。デモアプリケーションでは、さまざまなトラック選択タイプ(ビデオ、オーディオ、テキストトラックを持つことができるため)でコードを再利用できるという点で少し優れています。

関連する問題