-Moved caption extraction and menu building into exoplayer track changing callback.
-Updated extractor dependency.
This commit is contained in:
parent
880676d670
commit
f506fc0478
2 changed files with 61 additions and 30 deletions
|
@ -676,7 +676,7 @@ public final class PopupVideoPlayer extends Service {
|
|||
|
||||
/*package-private*/ void enableVideoRenderer(final boolean enable) {
|
||||
final int videoRendererIndex = getRendererIndex(C.TRACK_TYPE_VIDEO);
|
||||
if (trackSelector != null && videoRendererIndex != -1) {
|
||||
if (trackSelector != null && videoRendererIndex != RENDERER_UNAVAILABLE) {
|
||||
trackSelector.setRendererDisabled(videoRendererIndex, !enable);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,6 +53,7 @@ import com.google.android.exoplayer2.SimpleExoPlayer;
|
|||
import com.google.android.exoplayer2.source.MediaSource;
|
||||
import com.google.android.exoplayer2.source.MergingMediaSource;
|
||||
import com.google.android.exoplayer2.source.SingleSampleMediaSource;
|
||||
import com.google.android.exoplayer2.source.TrackGroup;
|
||||
import com.google.android.exoplayer2.source.TrackGroupArray;
|
||||
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
|
||||
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
|
||||
|
@ -98,6 +99,7 @@ public abstract class VideoPlayer extends BasePlayer
|
|||
// Player
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
protected static final int RENDERER_UNAVAILABLE = -1;
|
||||
public static final int DEFAULT_CONTROLS_HIDE_TIME = 2000; // 2 Seconds
|
||||
|
||||
private ArrayList<VideoStream> availableStreams;
|
||||
|
@ -105,8 +107,6 @@ public abstract class VideoPlayer extends BasePlayer
|
|||
|
||||
protected String playbackQuality;
|
||||
|
||||
private List<Subtitles> availableCaptions;
|
||||
|
||||
protected boolean wasPlaying = false;
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
|
@ -271,35 +271,32 @@ public abstract class VideoPlayer extends BasePlayer
|
|||
playbackSpeedPopupMenu.setOnDismissListener(this);
|
||||
}
|
||||
|
||||
private void buildCaptionMenu() {
|
||||
private void buildCaptionMenu(final List<String> availableLanguages) {
|
||||
if (captionPopupMenu == null) return;
|
||||
captionPopupMenu.getMenu().removeGroup(captionPopupMenuGroupId);
|
||||
|
||||
if (availableCaptions == null || trackSelector == null) return;
|
||||
|
||||
// Add option for turning off caption
|
||||
MenuItem captionOffItem = captionPopupMenu.getMenu().add(captionPopupMenuGroupId,
|
||||
0, Menu.NONE, R.string.caption_none);
|
||||
captionOffItem.setOnMenuItemClickListener(menuItem -> {
|
||||
final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT);
|
||||
if (trackSelector != null && textRendererIndex != -1) {
|
||||
if (trackSelector != null && textRendererIndex != RENDERER_UNAVAILABLE) {
|
||||
trackSelector.setRendererDisabled(textRendererIndex, true);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
// Add all available captions
|
||||
for (int i = 0; i < availableCaptions.size(); i++) {
|
||||
final Subtitles subtitles = availableCaptions.get(i);
|
||||
final String captionLanguage = PlayerHelper.captionLanguageOf(subtitles);
|
||||
for (int i = 0; i < availableLanguages.size(); i++) {
|
||||
final String captionLanguage = availableLanguages.get(i);
|
||||
MenuItem captionItem = captionPopupMenu.getMenu().add(captionPopupMenuGroupId,
|
||||
i + 1, Menu.NONE, captionLanguage);
|
||||
captionItem.setOnMenuItemClickListener(menuItem -> {
|
||||
final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT);
|
||||
if (trackSelector != null && textRendererIndex != -1) {
|
||||
trackSelector.setRendererDisabled(textRendererIndex, false);
|
||||
if (trackSelector != null && textRendererIndex != RENDERER_UNAVAILABLE) {
|
||||
trackSelector.setParameters(trackSelector.getParameters()
|
||||
.withPreferredTextLanguage(captionLanguage));
|
||||
trackSelector.setRendererDisabled(textRendererIndex, false);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
@ -319,7 +316,6 @@ public abstract class VideoPlayer extends BasePlayer
|
|||
super.sync(item, info);
|
||||
qualityTextView.setVisibility(View.GONE);
|
||||
playbackSpeedTextView.setVisibility(View.GONE);
|
||||
captionTextView.setVisibility(View.GONE);
|
||||
|
||||
if (info != null) {
|
||||
final List<VideoStream> videos = ListHelper.getSortedStreamVideosList(context,
|
||||
|
@ -331,14 +327,10 @@ public abstract class VideoPlayer extends BasePlayer
|
|||
selectedStreamIndex = getOverrideResolutionIndex(videos, getPlaybackQuality());
|
||||
}
|
||||
|
||||
availableCaptions = info.getSubtitles();
|
||||
|
||||
buildQualityMenu();
|
||||
buildPlaybackSpeedMenu();
|
||||
buildCaptionMenu();
|
||||
qualityTextView.setVisibility(View.VISIBLE);
|
||||
playbackSpeedTextView.setVisibility(View.VISIBLE);
|
||||
captionTextView.setVisibility(availableCaptions.isEmpty() ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -469,17 +461,7 @@ public abstract class VideoPlayer extends BasePlayer
|
|||
@Override
|
||||
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
|
||||
super.onTracksChanged(trackGroups, trackSelections);
|
||||
if (captionTextView == null) return;
|
||||
|
||||
if (trackSelector == null) {
|
||||
captionTextView.setVisibility(View.GONE);
|
||||
} else if (trackSelector.getRendererDisabled(getRendererIndex(C.TRACK_TYPE_TEXT)) ||
|
||||
trackSelector.getParameters().preferredTextLanguage == null) {
|
||||
captionTextView.setText(R.string.caption_none);
|
||||
} else {
|
||||
final String preferredLanguage = trackSelector.getParameters().preferredTextLanguage;
|
||||
captionTextView.setText(preferredLanguage);
|
||||
}
|
||||
onTextTrackUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -495,6 +477,55 @@ public abstract class VideoPlayer extends BasePlayer
|
|||
animateView(surfaceForeground, false, 100);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// ExoPlayer Track Updates
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
private void onTextTrackUpdate() {
|
||||
final int textRenderer = getRendererIndex(C.TRACK_TYPE_TEXT);
|
||||
|
||||
if (captionTextView == null) return;
|
||||
if (trackSelector == null || trackSelector.getCurrentMappedTrackInfo() == null ||
|
||||
textRenderer == RENDERER_UNAVAILABLE) {
|
||||
captionTextView.setVisibility(View.GONE);
|
||||
return;
|
||||
}
|
||||
|
||||
final TrackGroupArray textTracks = trackSelector.getCurrentMappedTrackInfo()
|
||||
.getTrackGroups(textRenderer);
|
||||
|
||||
// Extract all loaded languages
|
||||
List<String> availableLanguages = new ArrayList<>(textTracks.length);
|
||||
for (int i = 0; i < textTracks.length; i++) {
|
||||
final TrackGroup textTrack = textTracks.get(i);
|
||||
if (textTrack.length > 0 && textTrack.getFormat(0) != null) {
|
||||
availableLanguages.add(textTrack.getFormat(0).language);
|
||||
}
|
||||
}
|
||||
|
||||
// Normalize mismatching language strings
|
||||
final String preferredLanguage = trackSelector.getParameters().preferredTextLanguage;
|
||||
// Because ExoPlayer normalizes the preferred language string but not the text track
|
||||
// language strings, some preferred language string will have the language name in lowercase
|
||||
String formattedPreferredLanguage = null;
|
||||
if (preferredLanguage != null) {
|
||||
for (final String language : availableLanguages) {
|
||||
if (language.compareToIgnoreCase(preferredLanguage) == 0)
|
||||
formattedPreferredLanguage = language;
|
||||
}
|
||||
}
|
||||
|
||||
// Build UI
|
||||
buildCaptionMenu(availableLanguages);
|
||||
if (trackSelector.getRendererDisabled(textRenderer) || formattedPreferredLanguage == null ||
|
||||
!availableLanguages.contains(formattedPreferredLanguage)) {
|
||||
captionTextView.setText(R.string.caption_none);
|
||||
} else {
|
||||
captionTextView.setText(formattedPreferredLanguage);
|
||||
}
|
||||
captionTextView.setVisibility(availableLanguages.isEmpty() ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// General Player
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
@ -688,7 +719,7 @@ public abstract class VideoPlayer extends BasePlayer
|
|||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
public int getRendererIndex(final int trackIndex) {
|
||||
if (simpleExoPlayer == null) return -1;
|
||||
if (simpleExoPlayer == null) return RENDERER_UNAVAILABLE;
|
||||
|
||||
for (int t = 0; t < simpleExoPlayer.getRendererCount(); t++) {
|
||||
if (simpleExoPlayer.getRendererType(t) == trackIndex) {
|
||||
|
@ -696,7 +727,7 @@ public abstract class VideoPlayer extends BasePlayer
|
|||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
return RENDERER_UNAVAILABLE;
|
||||
}
|
||||
|
||||
public boolean isControlsVisible() {
|
||||
|
|
Loading…
Reference in a new issue