基于Android的MediaPlayer的音乐播放器的封装

使用过android原生的mediaplayer来做音频播放的同学们,肯定是经历过一些痛苦的,因为android提供了一个状态机,确实这个状态机是需要的,不过这个状态不对,就要往外抛出异常,并且如果在程序中,不能得知mediaplayr的状态,这个是着实让人头疼,个人之前写过mediaplayer的一个封装,将这些状态的获取以及操作进行了简化

封装的链接地址: PandaPan音频处理

1 原生的mediaplayer

android原生的mediaplayer,简单做一下介绍,mediaplayer顾名思义,就是用于多媒体播放的,这个类,是可以做音频和视频流的播放的是基于android的多媒体框架做的,android的多媒体框架,支持的音频格式也是有限的, 支持的格式的链接如下: android多媒体支持的格式, 能够看到,其实还是挺头疼的, 要想在android的主流版本上支持一些高清的格式,例如flac,ape等,你看,mediaplayer还是不靠谱的,那就得自己做这块的音频的解析啦, 可以有几种方式,

方式1: native解码, java层操作

一种就是使用原生的解码器,解出来为pcm数据,然后使用android的audio来播放,不过这种方式,还需要将数据通过native层解析,然后交给java层来处理,这种方式呢,比较适合我们找到对应的codec,来处理,而这些codec,官方是提供的,但是针对不同的格式,也是需要自己写不同的java层,来封装好各种格式的数据,最终给audioTrack来使用,挺费劲的

方式2: native解码与播放

就是将解码与播放,都使用native来播放,android的native播放音频模块是OpenSL ES,这种方式比较好,原因如下:

  1. native效率高,不需要和java层多次交互
  2. 我们java工程师,需要做的事情就比较少啦,哈哈

说了这些擦边的,回归到正题

为什么要做再次的封装,原因汇总如下:

  1. android 原生的mediaplayer,容易抛出异常,而且没有状态的获取,很容易出现问题
  2. android的音频状态机设计的也是比较复杂的,你看看官网中提供的这个状态机的图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-onRBkqQG-1631446539701)(https://developer.android.com/images/mediaplayer_state_diagram.gif)] 当然也是因为android的官方,做的很细致,但是这给我们只是想播放音频带来了一些麻烦
  3. 可替换性不强,因为直接使用mediaplayer的相关接口,假如我们要播放一些我们不支持的音频的格式的话,那么估计就要写很多的if else了,这样肯定不是我们想要的,我们想用的是接口简单方便使用,而且可以替换的,那么这就涉及面向接口的编程啦

2 mediaplayer的再次设计

上面说的原因那么多,这其实就是我们再次设计的需求:转换为对应的需求:

  1. 提供接口,支持播放,暂停,继续播放,停止播放,seekTo()
  2. 获取当前播放器的状态,获取播放的路径, 时长, 是否正在播放
  3. 提供接口,可以对其设置监听,可以得知当前播放器状态的变化

2.1 状态的再次设计

基于这么几点,以及android原生播放器的状态图,以及在不同状态支持的操作,我将android的mediaplayer的状态进行了简化.

总共有五个状态

  • 空闲状态 IDLE (对应mediaplayer中的Idle)
  • 初始化状态 INITIALIZED(对应MediaPlayer的Initialized)
  • 准备中的状态 PREPARING (对应MediaPlayer的Preparing)
  • 准备好的状态 PREPARED (对应mediaplayer的Prepared)
  • 运行中的状态 RUNNING (对应mediaplayer的Started +Paused)

大家可能会有疑问,那么其他的状态,其实其他的状态被我直接给简化处理了

图中的End,ErrorPlayerbackComplete状态都直接将mediaplayer给清空了,将Mediaplayer直接重新设置为新的mediaplayer,恢复到了IDLE状态,因而简化了N多操作

2.2 向外通知变化

上面我们提供的状态变化,会向外做通知

Preparing --> Prepared --> (Pause + Play) – {OnErro/OnStopped/OnComplete}

OnProgressChanged

###2.3 疑问解答

大家可能会提到,为什么不把循环播放,以及自动播放下一首放到这个类实现?愿意如下:

  1. 类要分功能和模块,这个类,只是用作状态的封装,不应该添加其他功能
  2. 在正常的工程中,我们要实现的循环播放,对应的数据,应该不只是简单的一个路径,对应的肯定是一些MediaInfo的数据,可能有title,artist等数据,这个我可以后续再次添加一个类,做这样的功能,内部调用StatedMediaPlayer即可

工程代码

封装的链接地址: PandaPan音频处理 这个工程下的类地址:

https://github.com/yqpan1991/DroidAudio/blob/master/app/src/main/java/droidaudio/apollo/edus/com/droidaudio/multimedia/media/StatedMediaPlay.java

基于Android的MediaPlayer的音乐播放器的封装相关推荐

  1. android音乐播放器案例,Android MediaPlayer实现音乐播放器实例代码

    Android MediaPlayer实现音乐播放器 1.布局文件 android:layout_width="fill_parent" android:layout_height ...

  2. 安卓java自实现mp3播放器,Android MediaPlayer实现音乐播放器实例代码

    Android MediaPlayer实现音乐播放器 1.布局文件 android:layout_width="fill_parent" android:layout_height ...

  3. Android应用开发--MP3音乐播放器滚动歌词实现

    Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日  简.美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先 ...

  4. android 存放音频文件夹里,Android 实现简单的音乐播放器效果(音频文件的三种存放)...

    Android 实现简单的音乐播放器效果(音频文件的三种存放).三种方法主要使用到的类 MediaPlayer.create() getAssets() new Mediaplayer() - 几个控 ...

  5. Android应用开发--MP3音乐播放器Service实现

    Android应用开发--MP3音乐播放器Service实现 2013年5月29日简.美音乐播放器开发记录 让网友们久等啦,关于简.美音乐播放器的开发,最重要的Service类总算是要发博了.关于An ...

  6. Android应用开发 MP3音乐播放器滚动歌词实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  7. Android应用开发--MP3音乐播放器代码实现(一)

    Android应用开发--MP3音乐播放器代码实现(一) 需求1:将内存卡中的MP3音乐读取出来并显示到列表当中 1. 从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3I ...

  8. Linux下基于Libmad库的MP3音乐播放器编写

    linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...

  9. [嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计【2018年给力项目】

    [嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计[2018年给力项目]是[创科之龙]团队aiku嵌入式视频教程系列制作的现有的音乐播放器. 主要功能实现: 1.新建工程,基类选 ...

最新文章

  1. java9可执行jar_单个java文件打成可执行jar包
  2. iview构建基本html页面,使用vue-cli创造基于vue.js的iview工程
  3. Mysql多表查询(案例2)
  4. java jar中jar_java – jar中的jar
  5. 4.5.2 循环语句
  6. Redis操作命令(一)
  7. php添加自定义头部关键字,WordPress主题制作中自定义头部的相关PHP函数解析
  8. python基础教程菜鸟教程-python基础菜鸟教程,Python的基础语法
  9. McCabe度量方法计算程序复杂度
  10. 问卷调查 java_java网络问卷调查系统
  11. PHP之tp3点击刷新验证码登录
  12. 视频教程-JSP+Servlet实战视频课程-Java
  13. Ribbon 服务调用
  14. 案例1—MP3在线搜索下载程序
  15. The server time zone value ‘� й ��� ׼ʱ ��‘ is unrecognized or represents more than one time zone.
  16. WPF基础五:UI②内容元素Frame
  17. 【sigma 协议】
  18. 怎么用python画直线_python怎么画直线
  19. kubernetes 曲线救国式下载 kubeadm 1.21 相关镜像
  20. 在ModelSim中添加Xilinx仿真库

热门文章

  1. 买手机怎么选?答:看图买
  2. 【tensorrt】——插件写法及python plugin大体流程
  3. Linux系统制作ios镜像Mondo Rescue工具安装及使用
  4. 图片报道:2008年12月4日夜晚,暴风雪突袭烟台(上)
  5. C/C++实现学生成绩管理系统
  6. Android开发经验
  7. elementUI表格头添加图标-鼠标移入显示el-tooltip提示信息
  8. Java算法学习:蓝桥杯——地宫寻宝(DFS+动态规划—记忆型递归)
  9. 算法血拼:Google+百度+Alibaba+字节+Tencent+网易+360+拼夕夕
  10. KICAD设计——原理图层次及标签