Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android音视频——系统播放器介绍(二)

Android音视频——系统播放器介绍(二)

作者头像
程思扬
发布于 2022-01-11 07:49:50
发布于 2022-01-11 07:49:50
8970
举报
文章被收录于专栏:程思阳的专栏程思阳的专栏

在上文Android音视频——系统播放器介绍(一)中,介绍到了状态,但是没有详细讲解,本篇就为大家带来MediaPlayer状态涉及到的方法。

此图是官方图例 椭圆代表MediaPlayer可能停留的状态。椭圆之间的箭头表示方法调用,状态切换的方向。单箭头表示方法同步调用,双箭头表示异步调用。

从图中我们可以看出MediaPlayer的状态切换和涉及到的方法。

Idle-End

当new一个MediaPlayer或者调用了reset函数,当前MediaPlayer会处于Idle状态。调用release后,会处于End状态。在这2个状态之间的可以看做是MediaPlayer的生命周期。

Error

一些情形可能会让MediaPlayer操作失败,比如不支持的音视频格式,分辨率过高,网络超时等等。 因此在这些情形下错误处理和恢复非常重要。有时候编程错误也会导致MediaPlayer操作错误。 开发者可以设置错误监听器setOnErrorListener(android.media.MediaPlayer.OnErrorListener)。当错误发生时,会调用用户实现的OnErrorListener.onError()方法。

不管有没有设置监听器,错误发生时MediaPlayer会进入Error状态。

为了重复使用同一个MediaPlayer对象,可以使用reset()方法把它从Error状态恢复到Idle状态。 设置错误监听器OnErrorListener是一个好的编程习惯。开发者可以监听到播放引擎的错误通知。 有时候会抛出IllegalStateException异常,比如在错误的状态调用了prepare(), prepareAsync()方法,或是setDataSource方法。

Initialized

当调用 seDataSource(FileDescriptor)setDataSource(String)、setDataSource(Context,Ur)、 seiDataSource(FileDescriptor,long,long)其中一个函数时,将传递 MediaPlayer 的 Idle 状态变成 nitialized(初始化状态,如果 setDatSource 在非 ldle 状态时调用,会抛出 legaStateException异常。当重载 setDataSource 时,需要抛出 llegalArgumentException 和 1OException 这两个异常。

Prepared

MediaPlayer有两种途径到达 Prepared 状态,一种是同步方式,另一种是异步方式。同步方式主要使用本地音视频文件,异步方式主要使用网络数据,需要缓冲数据。调用 prepare(同步函数)将传递 MediaPlayer 的 Initialized 状态变成 Prepared 状态,或者调用 prepareAsync(异步函数)将传递 MediaPlayer 的 Initialized 状态变成 Preparing 状态,最后到 Prepared 状态。如果应用层事先注册过 setOnPreparedListener.播放器内部将回调用户设置的 OnPreparedListener 中的 onPrepared 回调函数,注意,Preparing 是一个瞬间状态(可理解为时间比较短)。

Started

在 MediaPlayer 进入 Prepared 状态后,上层应用即可设置一些属性,如音视频的音量。 screenOnWhilePlaying、looping 等。在播放控制开始之前,必须调用 start 涵数并成功返回。 Mediaplayer的状态开始由 Preparod 状态变成 Started 状态。当处于 Started 状态时,如果用户先注册过setOnBufferingUpdateListener,播放器内部会开始回调 OnBuferingUpdatel itene.o BufferingUpdate,这个回调函数主要使应用程序保持跟踪音视频流的 buffering(缓冲) status,如果 MediaPlayer 已经处于 Started 状态,再调用 start 函数是没有任何作用的。

Paused

MediaPlayer 在播放控制时可以是 Paused(暂停)和 Stopped(停止)状态的,且当前的播放时进度可以被调整,当调用 MediaPlayerpause 函数时,MediaPlayer 开始由 Started 状态变成 Paused 状态,这个从 Started 状态到 Paused 状态的过程是瞬间的,反之在播放器内部是异步过程的。在状态更新并调用isPlaying 函数前,将有一些耗时。已经缓冲过的数据流,也要耗费数秒。 当start 函数从Paused 状态恢复回来时,playback 恢复之前暂停时的位置,接着开始播放,这时MediaPlayer的 Paused 状态又变成 Started 状态。如果 MediaPlayer 已经处于 Paused状态,这时再调用 pause 函数是没有任何作用的,将保持 Paused 状态。

Stopped

当调用 stop函数时,MediaPlayer 无论正处于 Started 、 Paused 、 Prepared 或 PlaybackCompleted 中的哪种状态,都将进入 Stopped 状态。一旦处于 Stopped 状态, playback 将不能开始,直到重新调用 prepare 或 prepareAsync 函数,且处于 Prepared 状态时才可以开始。 如果 MediaPlayer 已经处于 Stopped 状态了,这时再调用 stop 函数是没有任何作用的,将保持 Stopped 状态。 在Seck 操作完成后,如果事先在 MediaPlayer 注册了 sctOnScckCompleteListener,播放器内部将回调 OnSeckComplete.onSeekComplete 函数。当然 seckTo 函数也可以在其他状态下被让用,如 Prepared、Paused 及 PlaybackCompleted 状态。

PlaybackCompleted

当前播放的位置可以通过getCurrentPosition 函数获取,通过 getCurrentPosition 函数,可跟踪播放器的播放进度。 当 MediaPlayer 播放到数据流的末尾时,一次播放过程完成。在 MediaPlayer 中事先调 setLooping(boolean)并设置为true,表示循环播放,MediaPlayer 依然处于 Started 状态。如果用 setLooping(boolean)并设置为 false(表示不循环播放),并且事先在 MediaPlayer 上注册过 setOnCompletionListener,播放器内部将回调OnCompletion.onCompletion 函数,这就表明 MediaPlayer开始进入 PlaybackCompleted(播放完成)状态。当处于 PlaybackCompleted 状态时,调用start函数,将重启播放器从头开始播放数据。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MediaPlayer(总结)--从对象生命周期理解MediaPlayer状态
为了方便先重复贴一下MediaPlayer的状态图和MediaPlayer 的基本框架
小蚂蚁与大象
2020/04/21
1.1K0
MediaPlayer(总结)--从对象生命周期理解MediaPlayer状态
Android MediaPalyer
Android提供的多媒体框架支持播放各种常见媒体类型,可以轻松地将音频、视频和图像集成到应用程序中。
Yif
2019/12/26
1K0
全志R128芯片 基础组件开发指南——RTOS 多媒体解码
介绍 FreeRTOS 下如何使用 rtplayer 的接口来开发播放器应用程序,方便播放器开发人员快速正确地开发,以及播放器测试人员如何根据该文档对 rtplayer 播放器进行验证测试。
阿志小管家
2024/02/02
4000
全志R128芯片 基础组件开发指南——RTOS 多媒体解码
Android MediaPlayer 播放音频
主要介绍使用MediaPlayer播放音频的方式。关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPlayer 基础简介。
AnRFDev
2021/02/01
2.3K0
Android音视频——NuPlayer框架
NuPlayer 是从 MediaPlayerFactory构造出来的实例 NuPlayerFactory产生的,其结构关系图 如图5-1所示。 MediaPlayerFactory 通过工厂模式创建 StagefrightFactory 和 NuPlayerFactory,然后通过 NuPlayerFactory 创建 NuPlayerDriver,接着通过 NuPlayerDriver 构建一个 NuPlayer,NuPlayer 作为播放器,其中涉及数据解析、解码、渲染等过程。
程思扬
2022/01/11
2.1K0
Android音视频——NuPlayer框架
Android MediaPlayer音频播放器详解
音频播放,是比较常见或常用的功能,比如音乐播放器、新闻播报、听书等等,而恰巧如果你想自定义一个音频播放器的话,本文一定对你有帮助!
yechaoa
2022/06/10
1.5K0
Android MediaPlayer音频播放器详解
Android音视频——系统播放器介绍(一)
相信大家看到这个标题就能想到,本篇讲的是什么播放器了,没错就是MediaPlayer。 分享一首动听的纯音乐Shut The Window!
程思扬
2022/01/11
7520
Android音视频——系统播放器介绍(一)
surfaceView+MediaPlayer的问题
1.黑屏原因:可能是由于surfaceView还没有创建完成就播放,肯定不行,所以必须在surfaceViewCreated里面才能播放
wust小吴
2019/07/08
2.2K0
2016级移动应用开发在线测试14-MediaPlayer
1. MediaStore类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。下面那些叙述是正确的()
达达前端
2022/04/29
8580
2016级移动应用开发在线测试14-MediaPlayer
MediaPlayer 的学习总结
在用 Android 的 MediaPlayer 做 音频播放器 开发时,遇到了一些问题,在此总结。
tonglei0429
2019/07/22
5010
MediaPlayer 的学习总结
Android音视频——MediaPlayerService
MediaPlay一定不少人都知道,那MediaPlayerService呢?有多少人了解过呢,MediaPlayerService和MediaPlayer直接到关系是什么?那么接下来带着这些疑问往下看
程思扬
2022/01/11
7300
Android音视频——MediaPlayerService
Android音视频——系统播放器介绍(三)
开发者可以设置一些监听器,监听MediaPlayer的状态,错误事件等等。开发者应在同一个线程中创建MediaPlayer与设置的监听器。
程思扬
2022/01/11
1K0
音视频开发之旅(44)-ExoPlayer介绍及简单使用
从这篇开始我们进入阶段五 —— 一些音视频开源项目的学习使用分析,今天我们进入ExoPlayer部分的学习实践
音视频开发之旅
2021/05/15
8.1K0
音视频开发之旅(44)-ExoPlayer介绍及简单使用
Android多媒体之视频播放器(基于MediaPlayer)
获取帧.png 基本上也就这么多了,最后讲一下视频封面帧图片的获取:数了一下这帧大概在15秒 测试了一下秒数越大,获取图片的速度越慢,也就是越卡,所以还是给0吧 如果在Adapter里实时加载会很卡,最好查询的时候就把bitmap放到实体类里,由于封面图不要很大 别把原图给放进去了,小心直接OOM。Bitmap的操作本文就不赘述了。
张风捷特烈
2019/03/15
5.6K0
Android多媒体之视频播放器(基于MediaPlayer)
05.视频播放器内核切换封装
05.视频播放器内核切换封装 目录介绍 01.视频播放器内核封装需求 02.播放器内核架构图 03.如何兼容不同内核播放器 04.看一下ijk的内核实现类 05.看一下exo的内核实现类 06.如何创建不同内核播放器 07.看一下工厂类实现代码 08.后期如何添加新的内核 00.视频播放器通用框架 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer,声网RTC视频播放器内核,原生MediaPlayer可以自由切换 对于视图状态切换和后期维护拓展,避免功能和业务出现耦合。比如需要
杨充
2020/10/16
2.4K0
ijkplayer 播放器的快速使用,和播放源更换
主要介绍ijkplayer sdk集成之后,我们如何进行播放rtsp或https链接的视频。
zinyan.com
2023/07/13
1.5K0
ijkplayer 播放器的快速使用,和播放源更换
MediaPlayer--stop()流程
frameworks/base/media/java/android/media/MediaPlayer.java
小蚂蚁与大象
2020/06/19
1.6K0
Android使用Service播放音乐
像音乐这种耗时的和适合后台操作的应当放在Service中进行操作,而不是放在Activity,下面就介绍使用Service的音乐播放器
夜雨飘零
2020/05/06
2.3K0
MediaPlayer(七)--prepareAsync
frameworks/base/media/java/android/media/MediaPlayer.java
小蚂蚁与大象
2020/04/21
1.3K0
【多媒体】多媒体架构(面向GPT的学习笔记记录)
不同的平台、系统以及应用程序可能具有不同的架构层次结构,但总体来说,这三个层次是构成多媒体架构的核心。
天天Lotay
2023/04/16
1.9K0
【多媒体】多媒体架构(面向GPT的学习笔记记录)
相关推荐
MediaPlayer(总结)--从对象生命周期理解MediaPlayer状态
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档