Exoplayer: Subtitles in jetpack compose


I'm making a media player, but I just can't seem to add subtitles. I immediately retrieve all the subtitles and pass them to MediaItem. When the user selects new subtitles, I retrieve them using trackSelectionParameters, where the ID is the link. The player plays them and saves them. And SubtitleView should display them, but I don't see any text. Right now, I have something like this:

var currentCues by remember { mutableStateOf<List<Cue>>(emptyList()) } var currentTracks by remember { mutableStateOf(Tracks.EMPTY) } LaunchedEffect(selectedSource) { currentCues = emptyList() val subtitleConfigs = playerData.subtitles.map { subtitle -> MediaItem.SubtitleConfiguration.Builder(Uri.parse(subtitle.src)) .setMimeType(MimeTypes.TEXT_VTT) .setId(subtitle.src) .setLabel(subtitle.label) .build() } val mediaItem = MediaItem.Builder() .setUri(selectedSource) .setSubtitleConfigurations(subtitleConfigs) .build() setItem(mediaItem) } LaunchedEffect(selectedSubtitles, currentTracks) { val trackSelectionParameters = exoPlayer.trackSelectionParameters.buildUpon() if (selectedSubtitles == null) { trackSelectionParameters.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true) trackSelectionParameters.clearOverridesOfType(C.TRACK_TYPE_TEXT) } else { trackSelectionParameters.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, false) currentTracks.groups.find { trackGroup -> trackGroup.type == C.TRACK_TYPE_TEXT && trackGroup.mediaTrackGroup.getFormat(0).id == selectedSubtitles }?.let { textTrackGroup -> trackSelectionParameters.setOverrideForType( TrackSelectionOverride(textTrackGroup.mediaTrackGroup, 0) ) } } exoPlayer.trackSelectionParameters = trackSelectionParameters.build() } DisposableEffect(exoPlayer) { val listener = object : Player.Listener { // ... override fun onCues(cueGroup: CueGroup) { currentCues = cueGroup.cues } override fun onTracksChanged(tracks: Tracks) { currentTracks = tracks } } exoPlayer.addListener(listener) onDispose { exoPlayer.removeListener(listener) } } Box( modifier = Modifier .fillMaxSize() .focusable() .onKeyEvent { // ... } ) { key(selectedSource) { PlayerSurface( player = exoPlayer, surfaceType = SURFACE_TYPE_TEXTURE_VIEW, modifier = Modifier .fillMaxSize() .resizeWithContentScale( contentScale = ContentScale.Fit, sourceSizeDp = null ) ) } AndroidView( factory = { ctx -> SubtitleView(ctx).apply { } }, update = { view -> view.setCues(currentCues) }, modifier = Modifier .fillMaxSize() .padding(bottom = if (isControlsVisible) 100.dp else 24.dp) )

At first, I was reloading all the videos whenever the user selected new ones. Now I load them all at once and just switch between them. But they still don't show up.

0
Aug 3 at 10:55 AM
User AvatarAsfhtgkDavid
#android#kotlin#android-jetpack-compose#exoplayer

No answer found for this question yet.