Есть ли пример библиотеки ExoPlayer + Leanback для использования субтитров?

Я нашел несколько примеров, которые работают с Leanback и ExoPlayer, и у меня все это работает, но я не могу заставить работать субтитры/титры. Самый новый пример Google, который я смог найти (https://github.com/android/tv-samples ) есть кнопка с субтитрами в образце Java, но они никогда не отображаются. В примере Kotlin есть комментарий, который говорит // TODO(owahltinez): handle captions.

Я попробовал эти изменения в одном из образцов, но это не помогло:

private void prepareMediaForPlaying(Uri mediaSourceUri) {
        String userAgent = Util.getUserAgent(getActivity(), "VideoPlayerGlue");
        DefaultDataSourceFactory defaultDataSourceFactory = new DefaultDataSourceFactory(getActivity(), userAgent);
        MediaSource mediaSource =
                new ExtractorMediaSource(
                        mediaSourceUri,
                        defaultDataSourceFactory,
                        new DefaultExtractorsFactory(),
                        null,
                        null);
        String subtitle = "https://subtitledomain/sintel-en.vtt";
        Uri uriSubtitle = Uri.parse(subtitle);
        MediaSource subtitleMediaSource = new SingleSampleMediaSource.Factory(defaultDataSourceFactory)
                .createMediaSource(uriSubtitle, Format.createTextSampleFormat(null, MimeTypes.TEXT_VTT, C.SELECTION_FLAG_FORCED, "n/a"), C.TIME_UNSET);
        mediaSource = new MergingMediaSource(mediaSource, subtitleMediaSource);
        mPlayer.prepare(mediaSource);
    }

А также это изменение:

    mTrackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
    DefaultTrackSelector.Parameters parameters = mTrackSelector.getParameters();
    mTrackSelector.setParameters(parameters.withSelectUndeterminedTextLanguage(true));

Пробовал менять язык субтитров на EN, не помогло. Я чувствую, что, вероятно, просто упускаю что-то маленькое, но я просто не знаю, что это может быть.

Спасибо.

Изменить: я сделал ветку и удалил весь код Leanback, а ExoPlayer просто оставил нетронутым и использовал com.google.android.exoplayer2.ui.PlayerView в моем Fragment вместо VideoFragment, и субтитры работали без каких-либо других изменений. Так что мне просто нужно как-то включить их на стороне Leanback.


person casolorz    schedule 02.12.2019    source источник


Ответы (2)


Чтобы субтитры работали, вам нужно переопределить lb_playback_fragment.xml и добавить SubtitleView.

app/src/main/res/layout/lb_playback_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<!--
    Copied from android source so that we can add the subtitle view
-->
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/playback_fragment_root"
    android:layout_width="match_parent"
    android:transitionGroup="false"
    android:layout_height="match_parent">

    <androidx.leanback.widget.NonOverlappingFrameLayout
        android:id="@+id/playback_fragment_background"
        android:transitionGroup="false"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <androidx.leanback.widget.NonOverlappingFrameLayout
        android:id="@+id/playback_controls_dock"
        android:transitionGroup="true"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

    <com.google.android.exoplayer2.ui.AspectRatioFrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center">

        <com.google.android.exoplayer2.ui.SubtitleView
            android:id="@+id/leanback_subtitles"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </com.google.android.exoplayer2.ui.AspectRatioFrameLayout>

</FrameLayout>

Как только это будет сделано, вы можете настроить DefaultTrackSelector для выбора нужной текстовой дорожки.

Вы можете увидеть полный код, основанный на образце проигрывателя с наклоном назад, в https://github.com/bennettpeter/android-MythTV-Leanfront. Изменение для добавления субтитров находится в этой фиксации.

person Peter Bennett    schedule 28.12.2019

Вот еще один подход: renderIndex = 0 для видео, = 1 для аудио, = 2 для субтитров/текста.

TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(rendererIndex);   

TrackSelectionArray currentTrackGroups = player.getCurrentTrackSelections();
TrackSelection currentTrackSelection = currentTrackGroups.get(rendererIndex);


for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) {

    TrackGroup group = trackGroups.get(groupIndex);

    for (int trackIndex = 0; trackIndex < group.length; trackIndex++) {
        Format trackFormat = group.getFormat(trackIndex);


        if(currentTrackSelection!=null && 
          currentTrackSelection.getSelectedFormat()==trackFormat){
            //THIS ONE IS SELECTED
        }

    }
}
person plditallo    schedule 09.12.2019
comment
Моя проблема не в настройке субтитров, если я уберу Leanback, субтитры будут работать нормально. Я думаю, что проблема в том, что библиотека Leanback показывает субтитры. - person casolorz; 12.12.2019