Как включить субтитры в Leanback ExoPlayer?

Я разрабатываю приложение для Android для ТВ, используя библиотеку Leanback. У меня есть видеопоток HLS с субтитрами srt из URI. Я использую ExoPlayer версию 2.5.4, используемую в этом пример приложения. Я создал свой MediaSource, используя:

private MediaSource onCreateMediaSource(Uri uri, Uri subtitleUri) {
    String userAgent = Util.getUserAgent(mContext, "ExoPlayerAdapter");
    MediaSource videoSource = new HlsMediaSource(uri,
            new DefaultDataSourceFactory(mContext, userAgent),
            null,
            null);
    Format subtitleFormat = Format.createTextSampleFormat(
            "1", MimeTypes.APPLICATION_SUBRIP, 0, "en");
    MediaSource subtitleSource = new SingleSampleMediaSource(
            subtitleUri,
            new DefaultDataSourceFactory(mContext, userAgent),
            subtitleFormat, C.TIME_UNSET);

    MergingMediaSource mergedSource =
            new MergingMediaSource(videoSource, subtitleSource);
    return mergedSource;
}

В моем PlaybackTransportControlGlue у меня есть PlaybackControlsRow.ClosedCaptioningAction. Когда эта кнопка нажата, что мне написать в диспетчере действий, чтобы переключить субтитры?

Я пробовал это:

@Override
public void onActionClicked(Action action) {
    if (action == mClosedCaptioningAction) {
        DefaultTrackSelector trackSelector = mAdapter.getTrackSelector();
        int rendererIndex = 0;
        if (mClosedCaptioningAction.getIndex() == PlaybackControlsRow.ClosedCaptioningAction.INDEX_ON) {
            MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
            TrackGroupArray textGroups = mappedTrackInfo.getTrackGroups(rendererIndex);
            int groupIndex = 0;

            trackSelector.setRendererDisabled(rendererIndex, false);
            MappingTrackSelector.SelectionOverride override =
                    new MappingTrackSelector.SelectionOverride(mTrackFactory, groupIndex, 0);
            trackSelector.setSelectionOverride(rendererIndex, textGroups, override);
        } else {
            trackSelector.setRendererDisabled(rendererIndex, true);
            trackSelector.clearSelectionOverrides();
        }
    }
    super.onActionClicked(action);
}

Я получил эту ошибку:

E/gralloc: unregister FBM buffer

person khateeb    schedule 02.11.2017    source источник
comment
У меня есть ответ, в котором говорится о выборе видеодорожки, но та же логика применима к выбору дорожки субтитров. Если вам нужна дополнительная информация, я могу написать более подробный ответ здесь. Просто дайте мне знать :) /questions/45835562/ Существует также этот ответ, который может быть более подходящим. Просто дайте мне знать, если это не то, что вы ищете: stackoverflow.com/questions/46521570/   -  person Kyle Venn    schedule 02.11.2017
comment
@KyleVenn Я уже сделал ваше предложение по второй ссылке. Первая ссылка, кажется, говорит об изменении качества видео и звука. я не хочу этого. Я просто хочу включать и выключать скрытые субтитры, когда я нажимаю кнопку. У меня уже есть слушатель на кнопке. Я хочу знать, какой код будет переключать CC.   -  person khateeb    schedule 14.11.2017
comment
Первая ссылка касается качества видео (TRACK_TYPE_VIDEO), но тот же код должен работать и для скрытых титров (поскольку они также поддерживаются группами дорожек). selector.setSelectionOverride(rendererIndex, trackGroups, override); по-прежнему будет работать на то, что вы хотите. Вместо C.TRACK_TYPE_VIDEO вам нужно C.TRACK_TYPE_TEXT. Если это неясно, просто дайте мне знать, и я напишу более подробный ответ ниже.   -  person Kyle Venn    schedule 14.11.2017
comment
@KyleVenn Я попробовал то, что было написано в первой ссылке, и пример приложения ExoPlayer, но безуспешно. Я просто не могу уложить это в голове. Я обновил вопрос своим кодом. Я использую ExoPlayer, как этот проект: github.com/googlesamples/leanback-showcase/blob/master/app/src/ . В этом проекте есть класс MediaPlayerGlue, в котором я написал приведенный выше код.   -  person khateeb    schedule 16.11.2017
comment
Хорошо, я попробую сделать их пример более понятным. Я бы рекомендовал использовать демонстрационное приложение ExoPlayer, которое делает именно то, что вам нужно (позволяет выбирать дорожку субтитров). Запуск этого приложения (на телефоне) и пошаговое выполнение кода выбора субтитров должно сделать его более понятным. Точно так же это будет работать и на телевидении.   -  person Kyle Venn    schedule 16.11.2017
comment
@KyleVenn Не могли бы вы показать, как это сделать?   -  person khateeb    schedule 24.11.2017


Ответы (1)


Хорошо, я только что ответил на вопрос, который заставил текстовые дорожки работать простым способом здесь. Это работает для адаптивных файлов (например, HLS), но мне пришлось бы изменить его, чтобы он работал с прогрессивными файлами (например, .mp4, который вы объединили с файлом .srt).

Это как минимум отправная точка.

Я хотел бы вернуться назад и заставить его полностью работать для вас, но я думаю, что это может быть вопрос работы с индексом дорожки и настройки переопределения, чтобы он не использовал AdaptiveFactory (из строки ниже).

TrackSelection.Factory factory = tracks.length == 1
            ? new FixedTrackSelection.Factory()
            : new AdaptiveTrackSelection.Factory(BANDWIDTH_METER);

У нас он полностью работает в нашем коде как для HLS, так и для прогрессивного, но наша реализация обернута множеством дополнительных архитектур, которые могут еще больше затруднить понимание основных компонентов.

person Kyle Venn    schedule 11.12.2017