在 ExoPlayer 中检测 pause/resume

Detect pause/resume in ExoPlayer

我在 github 中搜索了两天这个问题,但找不到真正的答案。我想要在 ExoPlayer > 2.x 中检测 pause / resume 的示例。 任何人都可以给我一个例子吗?我检查了 onPlayerStateChanged,但问题没有解决。

onPlayerStateChanged   :   STATE_BUFFERING 
onPlayerStateChanged   :   STATE_READY 

我刚从 onPlayerStateChanged 那里得到这个日志,但并不是一直调用它!

编辑---

请参考 Player.isPlaying() 方法,该方法以 API 形式提供。

“不必单独检查这些属性,可以调用 Player.isPlaying。”

https://exoplayer.dev/listening-to-player-events.html#playback-state-changes

--- 编辑结束

您需要检查 playWhenReadyPlayer.EventListener. The Playback states of ExoPlayer 是否独立于播放器是否暂停:

player.addListener(new Player.DefaultEventListener() {
  @Override
  public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
    if (playWhenReady && playbackState == Player.STATE_READY) {
      // media actually playing
    } else if (playWhenReady) {
      // might be idle (plays after prepare()), 
      // buffering (plays when data available) 
      // or ended (plays when seek away from end)
    } else {
      // player paused in any state
    }
  }
});

给play/pause播放器ExoPlayer提供

player.setPlayWhenReady(boolean)

带有媒体文件的 ExoPlayer 的播放状态序列从不停止重新缓冲,在四种状态中的每一种中都有一次,并且不表示 play/paused:

Player.STATE_IDLE;
Player.STATE_BUFFERING;
Player.STATE_READY;
Player.STATE_ENDED;

每次玩家需要缓冲时:

Player.STATE_READY;
Player.STATE_BUFFERING;
Player.STATE_READY;

设置 playWhenReady 不影响状态。

时,您的媒体实际上正在播放
playWhenReady && playbackState == Player.STATE_READY

准备就绪后播放。 :)

您可以使用exoplayer.getPlayWhenReady()查看播放器当前是处于暂停状态还是播放状态。

你可以使用这个功能:

public boolean isPlaying() {
    return exoPlayer.getPlaybackState() == Player.STATE_READY && exoPlayer.getPlayWhenReady();
}

I had the same requirement to detect the click event of exoplayer play/pause button. Above answers were mainly talking about the state not about the button click event.

我就是这样做来检测 Play/Pause 按钮点击的,效果很好。

第 1 步:创建自定义控件调度程序 class 并覆盖方法 dispatchSetPlayWhenReady

class PlayerControlDispatcher : DefaultControlDispatcher() {
    override fun dispatchSetPlayWhenReady(player: Player?, playWhenReady: Boolean): Boolean {
        if(playWhenReady) {
           // Play button clicked
        } else {
          // Paused button clicked
        }
        return super.dispatchSetPlayWhenReady(player, playWhenReady)
    }
}

第 2 步:将自定义控件调度程序 class PlayerControlDispatcher 设置到播放器视图中。

playerView.setControlDispatcher(PlayerControlDispatcher())

其中 playerView 是我们在布局文件中声明的 com.google.android.exoplayer2.ui.PlayerView 的一个实例。

肯定是其他答案贴出来后,Player.EventListener又提供了一个新的方法。 [编辑:现在是 Player.Listener,因为 Player.EventListener 已被弃用]。这对我很有效:

override fun onIsPlayingChanged(isPlaying: Boolean) {
    // your code here
}

如果 isPlaying 为 false,则暂停,否则播放。

Kotlin 2020 解决方案更新

状态变化和播放错误等事件被报告给已注册的 Player.EventListener 个实例。

Player.EventListener默认方法为空,所以你只需要实现你感兴趣的方法。

首先你的class,说你的activity,已经符合Player.EventListener接口。

然后在 class 上覆盖 onIsPlayingChanged 方法。 onCreate 方法之外...

将侦听器添加到您的播放器实例:

// Adding player listener for tracking events
player?.addListener(this)

你可以通过Player.isPlaying:

检查玩家是否在玩(即位置在前进)
//Listening to player events
override fun onIsPlayingChanged(isPlaying: Boolean){
    if (isPlaying) {
        // Active playback.
    } else {
        // Not playing because playback is paused, ended, suppressed, or the player
        // is buffering, stopped or failed. Check player.getPlaybackState,
        // player.getPlayWhenReady, player.getPlaybackError and
        // player.getPlaybackSuppressionReason for details.
    }
}

就是这样。很简单。

请尝试截取下面的代码。播放器侦听器 (onPlayerStateChanged) 不利于观察其多次调用的播放/暂停操作,也无法在播放器配置时调用。

videoView.setControlDispatcher(object : DefaultControlDispatcher() {
            override fun dispatchSetPlayWhenReady(player: Player, playWhenReady: Boolean): Boolean {
                if (playWhenReady)
                  // Tap on Play button  
                else
                 // Tap on Pause button
                return super.dispatchSetPlayWhenReady(player, playWhenReady)
            }
        })

科特林

private fun ExoPlayer.isPlaying() =
    playbackState == Player.STATE_READY && playWhenReady

我认为回调:

fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int)

来自Player.Listener

对于版本 2.16.1,我使用此代码:

exoPlayer.addListener(object : Player.Listener {
    override fun onIsPlayingChanged(isPlaying: Boolean) {
        if (isPlaying){
            videoIsPlaying()
        }
    }
})