【问题标题】:Exoplayer and ProgressBarExoplayer 和 ProgressBar
【发布时间】:2017-08-04 15:32:07
【问题描述】:

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

【问题讨论】:

  • this example:在缓冲时收听播放器状态以显示进度条,可以更改视频和音轨,在 youtube 应用中跳过 10 秒等等。

标签: android progress-bar exoplayer


【解决方案1】:

也许它会对某人有所帮助:

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

【讨论】:

  • 它的app:show_buffering="always|never|when_playing" 而不是真/假
  • 感谢您的补充,现在方法setShowBuffering(boolean showBuffering)已被弃用(自2.9.0版本),推荐setShowBuffering(int showBuffering),因此旧的xml属性不起作用最新版本
  • 那我们可以用什么?
【解决方案2】:

在布局文件中:

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

【讨论】:

  • ExoPlayer.STATE_BUFFERING 已弃用,请改用Player.STATE_BUFFERING
  • 这对我有帮助,也喜欢@ShanXeeshi 的评论,ExoPlayer.STATE_BUFFERING 已弃用,请使用 Player.STATE_BUFFERING
  • 显示progressBar时如何隐藏播放按钮? (如 youtube)
【解决方案3】:

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

【讨论】:

  • 显示progressBar时如何隐藏播放按钮? (如 youtube)
  • @roghayehhosseini 为 exo 控制器使用自定义视图,您可以隐藏任何您想要的按钮。
  • 我使用自定义视图,但如何在 PlayerEventListener 类中做到这一点?
  • 如果我想在 PlayerView 之外显示我的进度条,那该怎么做,请指导我
【解决方案4】:

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

    }
};

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        您可以在 xml 文件中的 playerView 中简单地添加 app:show_buffering="when_playing" attr

        更多信息请参见https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/ui/PlayerView.html#SHOW_BUFFERING_WHEN_PLAYING

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 2012-12-16
          相关资源
          最近更新 更多