Exoplayer и ProgressBar

Я новичок в Android Studio и ExoPlayer. Я запустил проигрыватель для воспроизведения видео, но я не знаю, чтобы определить, выполняет ли проигрыватель буферизацию, и показать индикатор выполнения, чтобы уведомить пользователя. Любая помощь, пожалуйста?


person Omar Alesharie    schedule 14.03.2017    source источник
comment
этот пример: прослушивание состояний проигрывателя для отображения индикатора выполнения во время буферизации, возможность изменять видео- и аудиодорожки, пропускать 10 секунд, как в приложении YouTube, и многое другое.   -  person Soon Santos    schedule 06.08.2018


Ответы (5)


Вы должны реализовать ExoPlayer.EventListener и переопределить onPlayerStateChanged(), чтобы определять состояние воспроизведения видео (STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED)

person Louis Nguyen    schedule 16.03.2017
comment
Как скрыть кнопку воспроизведения при отображении ProgressBar? (как YouTube) - person roghayeh hosseini; 13.04.2019
comment
@roghayehhosseini использует настраиваемый вид для контроллера exo, и вы можете скрыть любую кнопку, которую хотите. - person Louis Nguyen; 16.04.2019
comment
Я использую настраиваемое представление, но как это сделать в классе PlayerEventListener? - person roghayeh hosseini; 17.04.2019
comment
Если я хочу отображать свою шкалу прогресса за пределами PlayerView, то как это сделать, пожалуйста, посоветуйте мне - person Gyan Swaroop Awasthi; 06.05.2021

Может кому будет полезно:

<com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/player_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/black"
        app:show_buffering="true"/>

вы можете просто изменить атрибут XML show_buffering, если используете Exoplayer2.

Также см. PlayerView.setShowBuffering(PlayerView.ShowBuffering) для подробнее.

person remain4life    schedule 25.09.2018
comment
Его app:show_buffering="always|never|when_playing" вместо истины / ложи - person Pratik Butani; 04.09.2019
comment
Спасибо за добавление, теперь метод setShowBuffering(boolean showBuffering) устарел (начиная с версии 2.9.0), рекомендуется setShowBuffering (int showBuffering), поэтому старые атрибуты xml не работают в последних версиях. - person remain4life; 05.09.2019
comment
что мы тогда можем использовать? - person NehaK; 18.06.2021

в файле макета:

<ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_gravity="center"/>

в активности игрока:

player.addListener(new ExoPlayer.EventListener() {
            @Override
            public void onTimelineChanged(Timeline timeline, Object manifest) {}

            @Override
            public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {}

            @Override
            public void onLoadingChanged(boolean isLoading) {}

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if (playbackState == ExoPlayer.STATE_BUFFERING){
                    progressBar.setVisibility(View.VISIBLE);
                } else {
                    progressBar.setVisibility(View.INVISIBLE);
                }
            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {}

            @Override
            public void onPositionDiscontinuity() {}

            @Override
            public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {}
        });
person Firoz Ahmed    schedule 27.07.2017
comment
ExoPlayer.STATE_BUFFERING устарел, используйте Player.STATE_BUFFERING вместо - person Shan Xeeshi; 22.02.2018
comment
Это помогло мне, и, как и комментарий @ShanXeeshi, ExoPlayer.STATE_BUFFERING устарел, используйте Player.STATE_BUFFERING - person Harry .Naeem; 24.10.2018
comment
Как скрыть кнопку воспроизведения при отображении ProgressBar? (как YouTube) - person roghayeh hosseini; 13.04.2019

Видя ответы других, я так и сделал. Я использовал ExoPlayer версии 2.7.0.

private Player.EventListener eventListener = new Player.EventListener() {

    @Override
    public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {

    }

    @Override
    public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
        //Log.i(TAG,"onTracksChanged");
    }

    @Override
    public void onLoadingChanged(boolean isLoading) {
        //Log.i(TAG,"onLoadingChanged");
    }

    @Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
        switch (playbackState) {
            case Player.STATE_ENDED:
                Log.i("EventListenerState", "Playback ended!");
                exoPlayer.setPlayWhenReady(false);
                break;
            case Player.STATE_READY:
                Log.i("EventListenerState", "Playback State Ready!");

                hideProgressBar();
                break;
            case Player.STATE_BUFFERING:
                Log.i("EventListenerState", "Playback buffering");
                showProgressBar();

                break;
            case Player.STATE_IDLE:

                break;

        }
    }

    @Override
    public void onRepeatModeChanged(int repeatMode) {

    }

    @Override
    public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

    }

    @Override
    public void onPlayerError(ExoPlaybackException error) {

    }

    @Override
    public void onPositionDiscontinuity(int reason) {

    }

    @Override
    public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

    }

    @Override
    public void onSeekProcessed() {

    }
};
person Harry .Naeem    schedule 24.10.2018

mPlayer.addListener (eventListener);

        Player.EventListener eventListener = new Player.EventListener() {
        @Override
        public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {

        }

        @Override
        public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

        }

        @Override
        public void onLoadingChanged(boolean isLoading) {

        }

        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            switch (playbackState) {
                case Player.STATE_ENDED:
                    Log.i("EventListenerState", "Playback ended!");
                    finish();
                    break;
            }
        }

        @Override
        public void onRepeatModeChanged(int repeatMode) {

        }

        @Override
        public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

        }

        @Override
        public void onPlayerError(ExoPlaybackException error) {

        }

        @Override
        public void onPositionDiscontinuity(int reason) {

        }

        @Override
        public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

        }

        @Override
        public void onSeekProcessed() {

        }
    };
person Ardit Zeza    schedule 03.12.2018