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



目录
相关文章
|
2月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
91 2
|
2月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
43 0
|
3月前
|
搜索推荐 Android开发 iOS开发
探索安卓与iOS系统的用户界面设计哲学
现代移动操作系统的设计哲学不仅仅是技术的表现,更是用户体验与功能实现的结合。本文将深入分析安卓与iOS两大主流系统在用户界面设计方面的差异与共通之处,探讨它们背后的思维模式及其对用户体验的影响。 【7月更文挑战第11天】
|
11天前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
|
8天前
|
Dart 开发工具 Android开发
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
|
4月前
|
XML 存储 数据库
如何使用Android Studio创建一个基本的音乐播放器应用
如何使用Android Studio创建一个基本的音乐播放器应用
127 0
|
1月前
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
55 1
|
1月前
|
Web App开发 网络协议 Android开发
Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【9月更文挑战第4天】本文详细对比了在Android平台上实现一对一音视频通话时常用的WebRTC、RTMP及RTSP三种技术方案。从技术原理、性能表现与开发难度等方面进行了深入分析,并提供了示例代码。WebRTC适合追求低延迟和高质量的场景,但开发成本较高;RTMP和RTSP则在简化开发流程的同时仍能保持较好的传输效果,适用于不同需求的应用场景。
62 1
|
2月前
|
Java 物联网 Android开发
移动应用与系统:技术演进与未来展望探索安卓应用开发:从新手到专家的旅程
【8月更文挑战第28天】本文将深入探讨移动应用开发的技术演进、移动操作系统的发展历程以及未来的发展趋势。我们将通过实例和代码示例,展示如何利用最新的技术和工具来开发高效、可靠的移动应用。无论你是初学者还是经验丰富的开发者,这篇文章都将为你提供有价值的信息和见解。 【8月更文挑战第28天】在这个数字时代,掌握安卓应用的开发技能不仅是技术人员的追求,也成为了许多人实现创意和梦想的途径。本文将通过深入浅出的方式,带领读者从零基础开始,一步步走进安卓开发的奇妙世界。我们将探讨如何配置开发环境,理解安卓应用的核心组件,以及如何通过实际编码来构建一个功能完整的应用。无论你是编程新手还是希望提升自己的开发者
|
2月前
|
存储 安全 物联网
Android经典实战之跳转到系统设置页面或其他系统应用页面大全
本文首发于公众号“AntDream”,关注获取更多技巧。文章总结了Android开发中跳转至系统设置页面的方法,包括设备信息、Wi-Fi、显示与声音设置等,并涉及应用详情与电池优化页面。通过简单的Intent动作即可实现,需注意权限与版本兼容性。每日进步,尽在“AntDream”。
178 2
下一篇
无影云桌面