Androidx kotlin使用ExoPlayer播放视频 设置SeekBar视频总时长、当前加载缓冲时长和当前播放时长
要设置SeekBar的视频总时长、当前加载缓冲时长和当前播放时长,你需要使用ExoPlayer的相关方法和监听器。以下是一个示例代码,演示如何实现这些功能:
import android.os.Bundle
import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.doAfterTextChanged
import com.google.android.exoplayer2.DefaultLoadControl
import com.google.android.exoplayer2.ExoPlayerFactory
import com.google.android.exoplayer2.SimpleExoPlayer
import com.google.android.exoplayer2.source.ExtractorMediaSource
import com.google.android.exoplayer2.source.MediaSource
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.ui.PlayerView
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
import com.google.android.exoplayer2.util.Util
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private lateinit var player: SimpleExoPlayer
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 创建ExoPlayer实例
player = ExoPlayerFactory.newSimpleInstance(this, DefaultTrackSelector(), DefaultLoadControl())
// 将ExoPlayer与PlayerView关联
player_view.player = player
// 创建数据源
val dataSourceFactory = DefaultDataSourceFactory(this, Util.getUserAgent(this, "ExoPlayerDemo"))
val mediaSource: MediaSource = ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(/*视频地址*/)
// 准备播放器
player.prepare(mediaSource)
// 监听视频总时长变化
player.addListener(object : Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_READY) {
val duration = player.duration
seek_bar.max = duration.toInt()
total_duration.text = formatTime(duration)
}
}
})
// 监听当前缓冲时长变化
player.addListener(object : Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_BUFFERING) {
val bufferedPosition = player.bufferedPosition
buffer_duration.text = formatTime(bufferedPosition)
}
}
})
// 监听当前播放时长变化
player.addListener(object : Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_READY || playbackState == Player.STATE_BUFFERING) {
val currentPosition = player.currentPosition
current_duration.text = formatTime(currentPosition)
seek_bar.progress = currentPosition.toInt()
}
}
})
// 监听SeekBar进度变化
seek_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) {
player.seekTo(progress.toLong())
}
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {}
override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
}
override fun onStart() {
super.onStart()
// 开始播放
player.playWhenReady = true
}
override fun onStop() {
super.onStop()
// 停止播放
player.playWhenReady = false
}
override fun onDestroy() {
super.onDestroy()
// 释放ExoPlayer实例
player.release()
}
// 格式化时间为 hh:mm:ss
private fun formatTime(timeMs: Long): String {
val totalSeconds = timeMs / 1000
val seconds = (totalSeconds % 60).toInt()
val minutes = ((totalSeconds / 60) % 60).toInt()
val hours = (totalSeconds / 3600).toInt()
return String.format("%02d:%02d:%02d", hours, minutes, seconds)
}
}
上述代码中,我们将ExoPlayer与PlayerView关联,并创建一个数据源,然后准备播放器。通过addListener方法,我们分别监听了视频总时长、当前缓冲时长和当前播放时长的变化。在监听回调中,我们更新了SeekBar的进度和显示的时间。另外,我们还使用setOnSeekBarChangeListener方法监听了SeekBar的进度变化,当进度发生变化时,我们通过seekTo方法来跳转到指定的播放位置
原文地址: https://www.cveoy.top/t/topic/iAIJ 著作权归作者所有。请勿转载和采集!