Exoplayer简单实用

Android  代码片段  小知识  2024年3月16日 pm6:03发布8个月前更新 城堡大人
120 0 0

前言

记录一下ExoPlayer的简单使用,记录于此,方便自己查阅。

正文

ExoPlayerMedia3 中此接口的默认实现。与 AndroidMediaPlayer API 相比,它增加了额外的便利性,例如支持多种流式传输协议、默认音频和视频渲染程序以及处理媒体缓冲的组件。ExoPlayer 易于自定义和扩展,可通过 Play 商店应用更新进行更新。

相对MediaPlayer来说,ExoPlayer的优势比较大。

这里只是简单的走一下大致的开发流程,创建一个VideoPlayer工程。

build.gradle

implementation "androidx.media3:media3-exoplayer:1.3.0"
implementation "androidx.media3:media3-ui:1.3.0"
//implementation "androidx.media3:media3-exoplayer-dash:1.3.0"

我这只是本地播放,只需要前面两个。

activity_main.xml

简单布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/background_dark"
    android:gravity="center"
    android:orientation="vertical">

    <androidx.media3.ui.PlayerView
        android:id="@+id/one_pv_play_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

MainActivity.java

简单介绍

//初始化播放数据,这里播放U盘数据
private List<MediaItem> mediaItemList = new ArrayList<>();
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/A.mp4"));
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/B.mp4"));
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/C.mp4"));
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/D.mp4"));
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/E.mp4"));
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/F.mp4"));
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/G.mp4"));
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/H.mp4"));
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/I.mp4"));
mediaItemList.add(MediaItem.fromUri("/storage/udisk0/J.mp4"));
private PlayerView mPlayerView;
mPlayerView = findViewById(R.id.one_pv_play_view);
private ExoPlayer mExoPlayer;
//初始化
mExoPlayer = new ExoPlayer.Builder(this).build();
//绑定mExoPlayer
mPlayerView.setPlayer(mExoPlayer);
//添加播放数据,我这是添加列表,当然也可以单独播放一个
mExoPlayer.addMediaItems(VideoApp.mediaItemList);
//添加Player监听
mExoPlayer.addListener(mListener);
//移除监听
mExoPlayer.removeListener(mListener);
private final Player.Listener mListener = new Player.Listener() {
    @Override
    public void onPlaybackStateChanged(int playbackState) {
        /**
         * STATE_IDLE      :始状态,播放器没有可播放的资源,播放器停止播放或者播放失败后也会处于该状态
         * STATE_BUFFERING :没有足够的数据可以加载播放,此时无法立即播放
         * STATE_READY     :播放器可以立即播放,是否播放取决于playWhenReady的值,true将会播放,否则不播。
         * STATE_ENDED     :播放完了所有的资源后处于该状态
         **/
         //STATE_IDLE =1 ,其他的以此加1
    }
    @Override
    public void onVideoSizeChanged(@NonNull VideoSize videoSize) {
        //视频信息,高宽
    }
    @Override
    public void onPlayerError(@NonNull PlaybackException error) {
        //视频播放错误
    }
    @Override
    public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) {
        //playWhenReady true 表示在播放;false 表示暂停
    }
};
//开始准备
mExoPlayer.prepare();
//准备好就播放
mExoPlayer.setPlayWhenReady(true);
//停止播放
mExoPlayer.stop()
//释放
mExoPlayer.release()
//设置播放模式
mExoPlayer.setRepeatMode(Player.REPEAT_MODE_ALL);

当然还有其它的方法

prepare 准备
playWhenReady 准备完成立即播放
play 播放
pause 暂停
seekTo 跳到指定进度
setRepeatMode 指定播放的循环模式
setPlaybackSpeed 播放速度
hasPreviousMediaItem 播放列表中是否有上一个
hasNextMediaItem 下一个媒体数据
seekToPreviousMediaItem 播放列表中指定进度为上一个
seekToNextMediaItem 下一个媒体数据
代码片段
public class OneActivity extends AppCompatActivity {
    private PlayerView mPlayerView;
    private ExoPlayer mExoPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one);
        initUI();
        initData();
    }

    @OptIn(markerClass = UnstableApi.class)
    @Override
    protected void onResume() {
        super.onResume();
        startVideo();
    }

    @Override
    protected void onPause() {
        super.onPause();
        stopVideo();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mExoPlayer) {
            mExoPlayer.stop();
            mExoPlayer.release();
            mExoPlayer.removeListener(mListener);
            mExoPlayer = null;
        }
    }

    private void initUI() {
        mPlayerView = findViewById(R.id.one_pv_play_view);
    }

    private void initData() {
        mExoPlayer = new ExoPlayer.Builder(this).build();
        mPlayerView.setPlayer(mExoPlayer);
        mExoPlayer.addMediaItems(VideoApp.mediaItemList);
    }

    private void startVideo() {
        mExoPlayer.addListener(mListener);
        mExoPlayer.prepare();
        mExoPlayer.setPlayWhenReady(true);
        mExoPlayer.setRepeatMode(Player.REPEAT_MODE_ALL);
    }

    private void stopVideo() {
        if (null != mExoPlayer) {
            mExoPlayer.stop();
        }
    }

    private final Player.Listener mListener = new Player.Listener() {
        @Override
        public void onPlaybackStateChanged(int playbackState) {
        }

        @Override
        public void onVideoSizeChanged(@NonNull VideoSize videoSize) {
        }

        @Override
        public void onPlayerError(@NonNull PlaybackException error) {
        }

        @Override
        public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) {

        }
    };
}

参考文章

  1. AndroidX Media

  2. Media3 ExoPlayer官方介绍

 历史上的今天

  1. 2023: Android文本绘制高宽获取(0条评论)
  2. 2021: CPU缓存(0条评论)
  3. 2021: I-Cache与D-Cache的区别(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

萧红:饿

“列巴圈”挂在过道别人的门上,过道好象还没有天明,可是电灯已经熄了。夜间遗留下来睡朦朦的气息充塞在过道,茶房气喘着,抹着地板。我不愿醒得太早,可是已经醒了,同时再不能睡去。厕所房的电灯仍开着,和夜间一般昏黄,好象黎明还没有到来,可是“列巴圈”已经挂上别人家的门了!有的牛奶瓶也规规矩矩地等在别的房间...

朱湘:海外寄霓君(节选)

一霓妹,我的爱妻:你从般若庵十二月初五写的“第一封”信我收到了。我后天就要搬家,你的信可以寄到憩轩四兄第一次替你打的信封那里。我在芝加哥城里过得好些,身体也好,望你不要记挂。我到今天总共收到你八封信。你信内并不曾提到岳母大人同憩轩四兄的病,想必是都好了。你的奶水不够,务必要请奶妈子。照我如今这般...

Android内存泄露检测之LeakCanary的简单使用

前言使用MAT来分析内存问题,有一些门槛,会有一些难度,并且效率也不是很高,对于一个内存泄漏问题,可能要进行多次排查和对比才能找到问题原因。为了能够简单迅速的发现内存泄漏,Square公司基于MAT开源了LeakCanary。PS:有不同版本的leakcanary出现不同的问题,因此2021...

塔斯格丝:给希望留点空间

西西里监狱是一级监狱,虽然坐落在城市的中央,但却感受不到丝毫的繁华与自由。卡洛奇自杀过很多次,可惜,狱警连他自杀的权利都给剥夺了。卡洛奇已经在这个小房间待了整整三年,只有每周放风时能看看“外面的世界”。越狱是绝对不可能,他唯一想做的就是下地狱,因为西西里监狱比地狱更折磨人。唯一的方式便是挑衅奥多...

[摘]Android图片加载框架之Glide和Picasso的区别

前言Glide和Picasso在实际中很常用,也容易忘记各个的优缺点。此文整理很全,因此摘抄于此,方便自己查阅。本文摘抄《Android图片加载框架之(Glide和Picasso的区别,Glide的简单使用)》)。正文Glide,一个被google所推荐的图片加载库,常见的还有Picas...

Android 修改ListView快速滚动条的bar

前言最近需要使用修改ListView快速滚动条的bar,ListView是可以默认支持的,但就是太丑了,需要定制一下。下面就记录一下自己使用的方法。好记性不如烂笔头正文本文并非原创,感谢网友分享。隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读