要设置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方法来跳转到指定的播放位置

Androidx kotlin使用ExoPlayer播放视频 设置SeekBar视频总时长、当前加载缓冲时长和当前播放时长

原文地址: https://www.cveoy.top/t/topic/iAIJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录