前言
记录一下ExoPlayer的简单使用,记录于此,方便自己查阅。
正文
ExoPlayer
是 Media3 中此接口的默认实现。与 Android 的MediaPlayer
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) { } }; }
参考文章
-
《》
-
《
历史上的今天
暂无评论...
随机推荐
柴静:真相常流失于涕泪交加中
一美国有一个著名的白宫记者,叫海伦.托马斯,逼问过9任总统,进攻性极强,后来白宫特别在新闻厅给她专门设了把椅子,上面用小铜牌刻着她名字,又用她的名字命名了一个奖项,盛誉极隆。她八十多岁的时候在书里回忆自己职业生涯,曾经感叹美国新闻业的萧条,说“不知畏惧,不带好恶地去报道,美国的新闻人忘了吗?”...
Android Zygote进程的启动流程简单分析
前言在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的,因为Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程for...
斯蒂芬.金:戒烟公司
莫里森在机场接人。他等的航班遇上了空中管制,飞机在肯尼迪机场上空盘旋,等待降落的指令。这个时候,他看见柜台那头有一个人很面熟,他朝他走去。“吉米?是吉米·麦卡恩吗?”真的是他。比一年前亚特兰大展销会时稍稍胖了一些,否则,他肯定看上去健康得让人嫉妒。上大学的时候,他很瘦,面色暗黄,烟抽得很凶,鼻...
Internet时间同步服务器地址
阿里云提供了7个NTP时间服务器也就是Internet时间同步服务器地址ntp1.aliyun.comntp2.aliyun.comntp3.aliyun.comntp4.aliyun.comntp5.aliyun.comntp6.aliyun.comntp7.aliyun.c...
bat脚本命令简介
批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式,只要遵守以下这条就ok了:每一行可视为一个命令,每个命令里可以含多条子命令,从第一行开始执行,直到最后一行结束,它运行的平台是DOS。批处理有一个很鲜明的特点:使用方便、灵活,功能强大,自动化程...
白岩松:幸福在哪里
一走在人群中,我习惯看一看周围人的手腕,那里似乎藏着一个属于当代中国人的内心秘密,从不言说,却日益增多。越来越多的人,不分男女,会戴上一个手串,这其中,不乏有人仅仅是为了装饰;更多的却带有祈福与安心的意味,这手串停留在装饰与信仰之间,或左或右。这其中,是怎样的一种相信或怎样的一种抚慰?又或者,来...