Exoplayer 和 ProgressBar

Exoplayer and ProgressBar

我是 Android Studio 和 ExoPlayer 的新手 我启动了播放器播放视频,但我不知道检测播放器是否正在缓冲并显示进度条来通知用户,有什么帮助吗?

您应该实施 ExoPlayer.EventListener 并覆盖 onPlayerStateChanged() 以检测播放视频进度的状态(STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED)

在布局文件中:

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

在播放器中 activity:

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) {}
        });

也许对某人有帮助:

<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"/>

如果您使用的是 Exoplayer2,您可以简单地更改 XML 属性 show_buffering

有关详细信息,另请参阅 PlayerView.setShowBuffering(PlayerView.ShowBuffering)

看到别人的回答,我就这样做了。我使用的 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() {

    }
};

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() {

        }
    };

现在 Player.EventListener 已弃用,而不是使用 Player.Listener

 simpleExoPlayer.addListener(object : Player.Listener {
                            override fun onTracksChanged(
                                trackGroups: TrackGroupArray,
                                trackSelections: TrackSelectionArray
                            ) {
                            }

                            override fun onLoadingChanged(isLoading: Boolean) {}
                            
                            override fun onPlayerStateChanged(
                                playWhenReady: Boolean,
                                playbackState: Int
                            ) {
                                if (playbackState == Player.STATE_BUFFERING) {
                                   
                                } 
                            }

                            override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters) {}
                        })

您只需在 xml 文件的 playerView 中添加 app:show_buffering="when_playing" 属性

查看此内容了解更多信息https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/ui/PlayerView.html#SHOW_BUFFERING_WHEN_PLAYING

它对我有用。

<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/videoPlayer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:resize_mode="fill"
    app:surface_type="texture_view"
    app:use_controller="true"
    app:show_buffering="always" />