How to enable / disable closed captions in the HLS Streaming URL in Exoplayer?

I am using Exoplayer version 2.0.4 to play HLS streams (.m3u8). My HLS streams contain closed captions with it. How can I control closed captions with exoplayer? Is it possible to hide / show subtitles as needed and change the location of the subtitle layout, if necessary?

+9
source share
4 answers

I was able to control the selection of titles in ExoPlayer 2 with DefaultTrackSelector. The code below has been modified based on the ExoPlayer 2 Demo class , which should be referenced for more information about the implementation. TrackSelectionHelper

To disable signatures, you must disable the renderer for text tracks and clear the selection overrides.

trackSelector.setRendererDisabled(TRACK_TEXT, true);
trackSelector.clearSelectionOverrides();

TRACK_TEXTis the local static variable that I created, which represents the index of text tracks (2) with respect to video / audio tracks. I believe that SelectionOverrides is just a software-defined selection of tracks.

, , SelectionOverride . , TrackGroupArray DefaultTrackSelector.

MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
TrackGroupArray textGroups = mappedTrackInfo.getTrackGroups(TRACK_TEXT); // list of captions
int groupIndex = 1; // index of desired caption track within the textGroups array

trackSelector.setRendererDisabled(TRACK_TEXT, false);
MappingTrackSelector.SelectionOverride override = 
    new MappingTrackSelector.SelectionOverride(fixedFactory, groupIndex, 0);
trackSelector.setSelectionOverride(TRACK_TEXT, textGroups, override);

(, trackSelector fixedFactory) ExoPlayer 2.

SubtitleView . TextRenderer.Output onCues().

@Override
public void onCues(List<Cue> cues) {
    if (subtitleView != null) {
        subtitleView.onCues(cues);
    }
}
+11

trackselecktor

-

trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
    trackSelector.setParameters(new DefaultTrackSelector.ParametersBuilder()
            .setRendererDisabled(C.TRACK_TYPE_VIDEO, true)
            .build()
    );

trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
    trackSelector.setParameters(new DefaultTrackSelector.ParametersBuilder()
            .setRendererDisabled(C.TRACK_TYPE_VIDEO, false)
            .build()
    );
+7

Exoplayer

implementation 'com.google.android.exoplayer:exoplayer:2.9.5'

MappingTrackSelector.SelectionOverride

,

DefaultTrackSelector.SelectionOverride

 MediaSource mediaSource =  new HlsMediaSource.Factory(mediaDataSourceFactory).createMediaSource(uri);

, :

   TrackGroupArray trackGroups = trackSelector.getCurrentMappedTrackInfo().getTrackGroups(newSubtitle.renderIndex);
DefaultTrackSelector.ParametersBuilder parametersBuilder = trackSelector.buildUponParameters();
DefaultTrackSelector.SelectionOverride override = new DefaultTrackSelector.SelectionOverride(newSubtitle.groupIndex, newSubtitle.indexWithinGroup);
boolean isDisabled = trackSelector.getParameters().getRendererDisabled(newSubtitle.renderIndex);
parametersBuilder.setRendererDisabled(newSubtitle.renderIndex, isDisabled);
if (override != null) {
parametersBuilder.setSelectionOverride(newSubtitle.renderIndex, trackGroups, override);
} 
else {
parametersBuilder.clearSelectionOverrides(newSubtitle.renderIndex);
}
trackSelector.setParameters(parametersBuilder);

:

 TrackGroupArray trackGroups = trackSelector.getCurrentMappedTrackInfo().getTrackGroups(newSubtitle.renderIndex);
    MappingTrackSelector.SelectionOverride override = new MappingTrackSelector.SelectionOverride(
    new FixedTrackSelection.Factory(), newSubtitle.groupIndex, newSubtitle.indexWithinGroup);
    trackSelector.setSelectionOverride(newSubtitle.renderIndex, trackGroups, override);
    trackSelector.setRendererDisabled(newSubtitle.renderIndex, false);

:

DefaultTrackSelector.ParametersBuilder parametersBuilder = trackSelector.buildUponParameters();
 parametersBuilder.setRendererDisabled(playingSubtitle.renderIndex, true);
 trackSelector.setParameters(parametersBuilder);
+1

, , (), DefaultTrackSelector, ExoPlayerFactory.newSimpleInstance, , rendererIndex, ( !) ExoPlayer, TrackType, - RendererIndex. , TrackTypes, com.google.android.exoplayer2.C, TRACK_TYPE_AUDIO, TRACK_TYPE_VIDEO TRACK_TYPE_TEXT. rendererIndexon the other hand, it can be any number starting at 0 (I suppose). Therefore, to disable a track, you first need to find its rendererIndex. then use the code below to disable the track:

trackSelector
            ?.buildUponParameters()
            ?.setRendererDisabled(rendererIndex, true)
            ?.let {
                trackSelector?.setParameters(it)
            }
0
source

Source: https://habr.com/ru/post/1670706/


All Articles