Android Media3 (I) - 简单视频播放
最编程
2024-03-08 08:34:05
...
在App开发中偶尔会需要播放视频,JetPack Media3是目前官方主推的视频播放库,使用ExoPlayer
作为默认播放器,让开发人员可以轻松的实现播放视频和音频功能。本文简单介绍下如何使用Media3库播放视频。
官方文档
添加依赖
在app module下的build.gradle中添加代码,如下:
dependencies {
implementation("androidx.media3:media3-ui:1.1.0")
implementation("androidx.media3:media3-session:1.1.0")
implementation("androidx.media3:media3-exoplayer:1.1.0")
}
添加PlayerView
在布局文件中添加PlayerView
,承载视频播放器,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.media3.ui.PlayerView
android:id="@+id/play_view"
android:layout_width="match_parent"
android:layout_height="320dp"
app:layout_constraintTop_toTopOf="parent"
app:resize_mode="fill"
app:show_buffering="always"
app:use_controller="false" />
</androidx.constraintlayout.widget.ConstraintLayout>
一些可配置参数如下:
插图参数:
参数名 | 类型 | 备注 |
---|---|---|
use_artwork | boolean | 是否使用插图 |
artwork_display_mode | enum | 插图显示模式(off、fit、fill) |
default_artwork | reference | 默认插图 |
控制器参数:
参数名 | 类型 | 备注 |
---|---|---|
use_controller | boolean | 是否使用控制器 |
hide_on_touch | boolean | 是否在触摸时隐藏控制器 |
hide_during_ads | boolean | 是否在广告播放期间隐藏控制器 |
auto_show | boolean | 是否自动显示控制器 |
show_timeout | integer | 显示控制器的超时时间 |
show_shuffle_button | boolean | 是否显示随机播放按钮 |
show_subtitle_button | boolean | 是否显示字幕按钮 |
show_vr_button | boolean | 是否显示VR按钮 |
time_bar_min_update_interval | integer | 进度条的最小更新时间间隔 |
animation_enabled | boolean | 是否启用控制器动画效果 |
PlayerView
参数:
参数名 | 类型 | 备注 |
---|---|---|
show_buffering | enum | 是否显示缓冲状态(never、when_playing、always) |
keep_content_on_player_reset | boolean | 当播放器重置时,是否在其上保留媒体内容(例如字幕) |
surface_type | enum | 视频渲染控件类型 (none、surface_view、texture_view、spherical_gl_surface_view、video_decoder_gl_surface_view) |
resize_mode | enum | 调整视频大小的模式 (fit、fixed_width、fixed_heigt、fill、zoom) |
播放视频
创建ExoPlayer
配置到PlayerView
中,设置好要播放的资源后就可以播放视频,代码如下:
class Media3ExampleActivity : AppCompatActivity() {
private lateinit var binding: LayoutMedia3ExampleActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = LayoutMedia3ExampleActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.includeTitle.tvTitle.text = "Media3 Example"
// 创建ExoPlayer,配置到PlayerView中
binding.playView.player = ExoPlayer.Builder(this)
.build()
binding.playView.player?.run {
// 设置播放监听
addListener(object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
super.onIsPlayingChanged(isPlaying)
// 播放状态变化回调
}
override fun onPlaybackStateChanged(playbackState: Int) {
super.onPlaybackStateChanged(playbackState)
when (playbackState) {
Player.STATE_IDLE -> {
//播放器停止时的状态
}
Player.STATE_BUFFERING -> {
// 正在缓冲数据
}
Player.STATE_READY -> {
// 可以开始播放
}
Player.STATE_ENDED -> {
// 播放结束
}
}
}
override fun onPlayerError(error: PlaybackException) {
super.onPlayerError(error)
// 获取播放错误信息
}
})
// 设置重复模式
// Player.REPEAT_MODE_ALL 无限重复
// Player.REPEAT_MODE_ONE 重复一次
// Player.REPEAT_MODE_OFF 不重复
repeatMode = Player.REPEAT_MODE_ALL
// 设置当缓冲完毕后直接播放视频
playWhenReady = true
}
binding.btnPlaySingleVideo.setOnClickListener {
binding.playView.player?.run {
// 停止之前播放的视频
stop()
//设置单个资源
setMediaItem(MediaItem.fromUri("https://minigame.vip/Uploads/images/2021/09/18/1631951892_page_img.mp4"))
// 开始缓冲
prepare()
}
}
binding.btnPlayMultiVideo.setOnClickListener {
binding.playView.player?.run {
// 停止之前播放的视频
stop()
// 设置多个资源,当一个视频播完后自动播放下一个
setMediaItems(arrayListOf(
MediaItem.fromUri("https://minigame.vip/Uploads/images/2021/09/18/1631951892_page_img.mp4"),
MediaItem.fromUri("https://storage.googleapis.com/exoplayer-test-media-1/mp4/dizzy-with-tx3g.mp4")
))
// 开始缓冲
prepare()
}
}
}
override fun onResume() {
super.onResume()
// 恢复播放
binding.playView.onResume()
}
override fun onPause() {
super.onPause()
// 暂停播放
binding.playView.onPause()
}
override fun onDestroy() {
super.onDestroy()
// 释放播放器资源
binding.playView.player?.release()
binding.playView.player = null
}
}
效果如图:
单视频 | 多视频 |
---|---|
示例
演示代码已在示例Demo中添加。
ExampleDemo github
ExampleDemo gitee
推荐阅读
-
AVFoundation 框架分析(二十二)--源代码的简单视频流预览和播放示例(2)
-
iOS 和 Android 平台上的 HLS 视频播放适配问题及解决方案
-
功能强大、简单易用的网络视频播放器 - Flowplayer(用法和演示)
-
android可用的视频地址,"Android "一个应用程序,可以获得国内各大视频网站的直接播放地址...
-
如何用 4 个简单步骤设置 Android 版微信语音和视频来电铃声
-
视频监控 Android 应用客户端 - Mjpg-streamer 推流播放
-
如何在 Android 中使用 OpenGL 播放视频
-
用于播放本地视频的 Android 应用程序代码
-
Android Media3 (I) - 简单视频播放
-
基于谷歌 Android 平台的 GVR 3D 全景视频播放器(支持本地文件和视频流)