Android Media3 (一)— 简单播放视频

在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_artworkboolean是否使用插图
artwork_display_modeenum插图显示模式(off、fit、fill)
default_artworkreference默认插图

控制器参数:

参数名类型备注
use_controllerboolean是否使用控制器
hide_on_touchboolean是否在触摸时隐藏控制器
hide_during_adsboolean是否在广告播放期间隐藏控制器
auto_showboolean是否自动显示控制器
show_timeoutinteger显示控制器的超时时间
show_shuffle_buttonboolean是否显示随机播放按钮
show_subtitle_buttonboolean是否显示字幕按钮
show_vr_buttonboolean是否显示VR按钮
time_bar_min_update_intervalinteger进度条的最小更新时间间隔
animation_enabledboolean是否启用控制器动画效果

PlayerView参数:

参数名类型备注
show_bufferingenum是否显示缓冲状态(never、when_playing、always)
keep_content_on_player_resetboolean当播放器重置时,是否在其上保留媒体内容(例如字幕)
surface_typeenum视频渲染控件类型 (none、surface_view、texture_view、spherical_gl_surface_view、video_decoder_gl_surface_view)
resize_modeenum调整视频大小的模式 (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
    }
}

效果如图:

单视频多视频
https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/779688c72b0b42f2a8010ccece187c6c~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/880d367b0d554c678a08aed8e338ef5b~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?

示例

演示代码已在示例Demo中添加。

ExampleDemo github

ExampleDemo gitee

作者:ChenYhong
链接:https://juejin.cn/post/7255785481119219768
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值