Как добавить адаптивный селектор дорожек в Exo-player v2.x?

Я настраиваю Exo Player в своем приложении, реализовал адаптивную потоковую передачу DASH в своем проигрывателе и хочу добавить функциональность для воспроизведения дорожки определенного качества, выбранного пользователем.

Моя версия проигрывателя Exo — 2.9.3, я попытался реализовать, следуя этим Stackoverflow Post, Medium Post, но это немного сбивает с толку и часть код устарел, и правда в том, что я новичок.

Вот мой код для инициализации плеера: -

private void initializePlayer() {
     if (player == null) {
        bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelection.Factory factory = new PlayerTrackSelector(bandwidthMeter);
        trackSelector = new DefaultTrackSelector(factory);
        player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
        player.addVideoListener(this);
        playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_ZOOM);
        player.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
        player.addListener(this);
        playerView.setPlayer(player);
    }
    MediaSource mediaSource = buildMediaSource(Uri.parse("http://192.168.43.238:3000/storage/video-dash/9e351142a4eb1664643bf93ba13959e8.mpd"));
    player.prepare(mediaSource, true, false);
    player.setPlayWhenReady(playWhenReady);
    player.seekTo(currentWindow, playbackPosition);
}

И TrackSelector класс:-

public class PlayerTrackSelector implements TrackSelection.Factory {
    private BandwidthMeter bandwidthMeter;

  public PlayerTrackSelector(BandwidthMeter bandwidthMeter) {
    this.bandwidthMeter = bandwidthMeter;
  }

@Override
public TrackSelection createTrackSelection(TrackGroup group, BandwidthMeter bandwidthMeter, int... tracks) {

    return new AdaptiveTrackSelection(group,tracks,bandwidthMeter,
            AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS,
            AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS,
            AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS,
            AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION,
            AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE,
            AdaptiveTrackSelection.DEFAULT_MIN_TIME_BETWEEN_BUFFER_REEVALUTATION_MS,
            Clock.DEFAULT);
  }
}

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


person Shashank Mishra    schedule 01.01.2019    source источник


Ответы (1)


Попробуйте следующий код. Вызовите следующий код, когда вам нужно показать список. rendererIndex -> Вы можете попробовать вручную. TRACK_TYPE_AUDIO = 1, TRACK_TYPE_VIDEO = 2.

ОБНОВЛЕНО:

MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
                    if (mappedTrackInfo != null) {
                        int rendererIndex = 2;
                        int rendererType = mappedTrackInfo.getRendererType(rendererIndex);
                        boolean allowAdaptiveSelections =
                                rendererType == C.TRACK_TYPE_VIDEO
                                        || (rendererType == C.TRACK_TYPE_AUDIO
                                        && mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO)
                                        == MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_NO_TRACKS);
                        Pair<AlertDialog, TrackSelectionView> dialogPair =
                                TrackSelectionView.getDialog(xxxxxxxxxxxxxx.this, "Track Selector", trackSelector, rendererIndex);
                        dialogPair.second.setShowDisableOption(true);
                        dialogPair.second.setAllowAdaptiveSelections(allowAdaptiveSelections);
                        dialogPair.first.show();
                    }
person Asuk Nath    schedule 02.01.2019
comment
Что такое rendererIndex? - person Shashank Mishra; 02.01.2019
comment
rendererIndex = индекс дорожек, из которых вы хотите выбрать. Существует три типа дорожек. Аудио, видео и текст (субтитры). Если у вас нет субтитров, то обычно rendererIndex обычно равен 2. Вы можете попробовать int rendererIndex = 2; чтобы получить список видео дорожек. - person Asuk Nath; 02.01.2019
comment
использование 2 показывает только auto и none, поэтому я использовал 0, который является параметром по умолчанию, тогда он работает отлично, в чем причина следования? - person Shashank Mishra; 02.01.2019
comment
Я не могу сказать, какой индекс треков равен 2. Обычно я нахожу тип renderindex с помощью MappingTrackSelector. Проверьте github.com/google/ExoPlayer/blob/release-v2/demos/main/src/main/ строка 634 - person Asuk Nath; 03.01.2019