Exoplayer和ProgressBar

21

我刚开始使用Android Studio和ExoPlayer,在使用播放器播放视频时,不知道如何检测播放器是否正在缓冲,并显示进度条通知用户。请问有什么帮助吗?


这个例子展示了如何监听播放器状态以在缓冲时显示进度条,还可以更改视频和音频轨道,跳过10秒钟(就像YouTube应用程序一样),以及其他很多功能。 - Soon Santos
8个回答

34

也许对某些人会有帮助:

<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)以了解更多详情。


11
应该使用"always|never|when_playing"来代替true/false,它位于"app:show_buffering"属性中。 - Pratik Butani
3
感谢您添加的内容,现在方法 setShowBuffering(boolean showBuffering) 已被弃用(自2.9.0版本起),建议使用 setShowBuffering(int showBuffering),因此旧的XML属性在最新版本中不起作用。 - remain4life
那么我们可以使用什么呢? - NehaK

17

在布局文件中:

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

7
ExoPlayer.STATE_BUFFERING已经过时,请使用Player.STATE_BUFFERING代替。 - Zeeshan
这对我很有帮助,也喜欢@ShanXeeshi的评论,ExoPlayer.STATE_BUFFERING已经被废弃,请使用Player.STATE_BUFFERING。 - Harry .Naeem
如何在显示进度条时隐藏播放按钮?(类似于YouTube) - roghayeh hosseini

12

你应该实现 ExoPlayer.EventListener 并重写 onPlayerStateChanged() 来检测播放视频进度的状态(STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED)


如何在显示进度条时隐藏播放按钮?(就像YouTube一样) - roghayeh hosseini
@roghayehhosseini 可以使用自定义视图来控制 exo,您可以隐藏任何想要隐藏的按钮。 - Louis Nguyen
我使用自定义视图,但如何在PlayerEventListener类中实现? - roghayeh hosseini
如果我想在PlayerView之外显示我的进度条,那么该怎么做,请指导我。 - Gyan Swaroop Awasthi

1

1

看到其他人的答案,我是这样做的。我使用了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() {

    }
};

1

它对我来说是有效的。

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

1

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

        }
    };

0

现在 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) {}
                        })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接