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

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

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

椭圆代表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函数,将重启播放器从头开始播放数据。



目录
相关文章
|
4月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
200 2
|
4月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
102 0
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
67 15
Android 系统缓存扫描与清理方法分析
|
1月前
|
算法 JavaScript Android开发
|
1月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
79 2
|
2月前
|
Java 程序员 开发工具
Android|修复阿里云播放器下载不回调的问题
虽然 GC 带来了很多便利,但在实际编码时,我们也需要注意对象的生命周期管理,该存活的存活,该释放的释放,避免因为 GC 导致的问题。
39 2
|
2月前
|
安全 搜索推荐 Android开发
深入探索安卓与iOS系统的差异及其对用户体验的影响
在当今的智能手机市场中,安卓和iOS是两大主流操作系统。它们各自拥有独特的特性和优势,为用户提供了不同的使用体验。本文将深入探讨安卓与iOS系统之间的主要差异,包括它们的设计理念、用户界面、应用生态以及安全性等方面,并分析这些差异如何影响用户的使用体验。
|
2月前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
1月前
|
安全 搜索推荐 程序员
深入探索Android系统的碎片化问题及其解决方案
在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。
|
1月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。