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

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

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

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