我正在使用Android上的exoplayer。当视频正在查找时,我需要显示进度指示器。 我可以在seekTo方法上开始显示进度指示器,但是在查找完成后应使用哪个回调方法隐藏进度指示器呢?
实现 ExoPlayer.EventListener
接口。其中有一个方法 onPlayerStateChanged
。当 playbackState == ExoPlayer.STATE_READY
时,隐藏进度指示器。
简短回答:听从@Sough的建议,使用EventListener.onPlaybackStateChanged
和STATE_READY
。
详细解释:
一开始看起来onSeekProcessed()
非常完美,但是从ExoPlayer v2.12.0版本开始,它已被废弃,并带有以下注释:
@deprecated Seeks are processed without delay. Listen to #onPositionDiscontinuity(int) with reason #DISCONTINUITY_REASON_SEEK instead.
因此应该使用带有原因DISCONTINUITY_REASON_SEEK
的onPositionDiscontinuity(int)
。
这让我想知道当寻求完成并准备好继续播放时(即“onSeekProcessed”),这是否会真正触发。因为语义上,寻求启动的那一刻就可以被解释为位置不连续(即“Seeks are processed without delay”)。
实际上,当您查看我在运行时情况下测量的事件时间时,事情变得明显:
0ms - <Seek initiated>
1ms - onPositionDiscontinuity -> DISCONTINUITY_REASON_SEEK
2ms - onPlaybackStateChanged -> STATE_BUFFERING
4ms - onSeekProcessed
208ms - onPlaybackStateChanged -> STATE_READY
这表明,使用STATE_READY
监听onPlaybackStateChanged
仍然是最佳选择。
结论:虽然onSeekProcessed
听起来不错,但它做了错误的事情。因此,它已经被弃用,并提供了一种替代方案。不幸的是,这个替代方案并不能实现预期的功能。棘手但真实。
onSeekProcessed()
,你将在Player.EventListener
中得到它。