Exoplayer、ExoMedia、または他のプレーヤーを使用してVimeoビデオに埋め込まれた異なる字幕をHLS形式で有効にする方法と選択する方法 iOSでは、これと同じビデオに既に字幕のオプションが表示されていますが、Androidでは実装方法が見つかりません。ExoplayerでHLS埋め込みキャプションを表示する方法
0
A
答えて
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);
上記のコードは非常にうっすらですが、うまくいけば、少なくとも正しい方向に着手してください。私は書かれたものを使用することはお勧めしません - それは主に、どのように一緒に収まるかを知ることです。デモアプリケーションでは、さまざまなトラック選択タイプ(ビデオ、オーディオ、テキストトラックを持つことができるため)でコードを再利用できるという点で少し優れています。
関連する問題
- 1. Instagram埋め込みキャプションにHTMLを埋め込みます
- 2. 埋め込みのGoogleマップでビジネスを表示する方法
- 3. カミソリに埋め込みとリンクを表示する方法は?
- 4. 埋め込みマニフェストを表示する方法
- 5. ExoPlayerをAndroidライブラリに埋め込む方法は?
- 6. 方法:埋め込みアクティビティのプレースホルダを表示
- 7. Qt Creatorの埋め込み方法埋め込みPSQL
- 8. OrientDB Studio - 埋め込みフィールド値の表示方法
- 9. 埋め込み方法
- 10. 埋め込みURL経由でPowerBI埋め込みにパラメータを渡す方法
- 11. フォームの埋め込みコレクション:埋め込みフォームフィールドは表示されません。
- 12. ExoplayerのHLSストリーミングURLでクローズドキャプションをオン/オフにする方法は?
- 13. javascriptで埋め込まれたブートストラップカルーセルにキャプションを追加する方法
- 14. 埋め込みPythonインタプリタで変数を表示する
- 15. ViewControllerの埋め込みNavigationControllerをプログラムで表示する
- 16. Visual C++:コードにコンパイル時メッセージを埋め込み表示する方法
- 17. 埋め込みマップに領域の境界線を表示する方法
- 18. pdf埋め込み/埋め込み
- 19. 埋め込みブートストラップレイアウトの埋め込み
- 20. Symfony3 - 埋め込みコレクションフォームは、表示されると空です。
- 21. SVG埋め込みイメージブラウザでのみ表示
- 22. Exoplayer適応型hlsストリーミング
- 23. 埋め込みフォームのフィールドコレクションフィールドを非表示にする
- 24. youtube動画をAndroidに埋め込み表示する
- 25. 埋め込みビデオURLをHtml.FromHTMLに表示するには
- 26. 埋め込みHTMLを表示するSignalRメッセージ
- 27. ExoPlayer - HLSビデオがライブかどうかを知る方法?
- 28. 埋め込みGoogleスプレッドに特定のシートのみを表示
- 29. 埋め込みリソースをUWPで読み取る方法は?
- 30. Androidシステム/プラットフォームアプリの埋め込み方法