当exo播放器在Android中缓存视频时如何通知用户?

时间:2017-01-25 10:53:30

标签: android video-streaming exoplayer

ExoPlayer类中有一个名为EventListener的接口。但是没有任何方法可以通知它是否被缓冲。

是否还有其他回调函数可用于检查ExoPlayer的状态?

3 个答案:

答案 0 :(得分:1)

  

但是没有任何方法可以通知它是否被缓冲。

你的意思是 看看我们什么时候有足够的缓冲

据我所知,对于EXOplayer:

...
} else if (state == ExoPlayer.STATE_BUFFERING) {
  boolean isNewlyReady = enabledRenderers.length > 0
      ? (allRenderersReadyOrEnded && haveSufficientBuffer(rebuffering))
      : isTimelineReady(playingPeriodDurationUs);
  if (isNewlyReady) {
    setState(ExoPlayer.STATE_READY);
    if (playWhenReady) {
      startRenderers();
    }
  }
} else if (state == ExoPlayer.STATE_READY) {
  boolean isStillReady = enabledRenderers.length > 0 ? allRenderersReadyOrEnded
      : isTimelineReady(playingPeriodDurationUs);
  if (!isStillReady) {
    rebuffering = playWhenReady;
    setState(ExoPlayer.STATE_BUFFERING);
    stopRenderers();
  }
}

...

whew setState:

private void setState(int state) {
  if (this.state != state) {
    this.state = state;
    eventHandler.obtainMessage(MSG_STATE_CHANGED, state, 0).sendToTarget();
  }
}

然后:

void handleEvent(Message msg) {
  switch (msg.what) {
    case ExoPlayerImplInternal.MSG_STATE_CHANGED: {
      playbackState = msg.arg1;
      for (EventListener listener : listeners) {
        listener.onPlayerStateChanged(playWhenReady, playbackState);
      }
      break;
    }
    ...

似乎我们可以通过这种方式获得playbackState?

答案 1 :(得分:0)

    private lateinit var player: SimpleExoPlayer
    player = ExoPlayerFactory.newSimpleInstance(this)
 
    player.addListener(object : Player.EventListener {
        override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
          
            if (playbackState == Player.STATE_BUFFERING) {
                videoProgress.visibility = View.VISIBLE
            } else {
                videoProgress.visibility = View.GONE
            }
        }

您可以在进度条的帮助下使用Player.STABUFFERING通知用户是否正在缓冲视频,并在状态更改时将其隐藏。

答案 2 :(得分:0)

我知道现在回答还为时已晚,但是如果有人仍在寻找答案,那么ExoPlayer已经提供了回调以标识播放器的播放状态。 EventListener接口提供了一种称为onPlaybackStateChanged()的方法,该方法提供有关播放器状态的更新。 EventLogger已经实现了这一点,在日志猫中,您在播放流时可能会在下面的日志中找到

D EventLogger: state [0.00, true, I]
D EventLogger: state [0.01, true, B]
D EventLogger: state [3.09, true, R]

其中I代表STATE_IDLE,B代表STATE_BUFFERING,R代表STATE_READY。 您可能要实现Player.EventListener以便在播放器缓冲时得到通知。 播放器停止播放流时,还会记录一个称为STATE_ENDED的状态。

我相信这个link将为您提供更多信息。