`
isiqi
  • 浏览: 16553622 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

MediaPlayer的状态

阅读更多
音频和视频的播放过程也就是MediaPlayer对象的状态转换过程。深入理解MediaPlayer的状态机是灵活驾驭OPhone多媒体编程的基础。图7-3是MediaPlayer的状态图,其中MediaPlayer的状态用椭圆形标记,状态的切换由箭头表示,单箭头代表状态的切换是同步操作,双箭头代表状态的切换是异步操作。 1. 创建与销毁 MediaPlayer可以通过静态方法MediaPlayer.create()或者new操作符来创建。这两种方法创建的 MediaPlayer对象处于的状态是不同的,使用create()方法创建的MediaPlayer对象处于prepared状态,因为系统已经根据参数的资源ID调用了setDataSource()和prepare()方法;使用new操作符创建的MediaPlayer对象则处于idle状态。除了刚刚构建的MediaPlayer对象处于idle状态外,调用reset()方法后的MediaPlayer状态也同样处于idle状态。由于处于 idle状态的MediaPlayer还没有设置数据源,无法获得多媒体的时长、视频的高度等信息,因此现在调用下列方法是典型的编程错误。对于刚刚创建的MediaPlayer对象调用如下方法,底层系统不会调用MediaPlayer注册的OnErrorListener,MediaPlayer的状态也不会改变。对于通过调用reset()方法进入idle状态的MediaPlayer对象调用如下方法,则会导致底层系统调用 OnErrorListener.onError()方法,MediaPlayer对象将进入error状态。 (点击查看大图)图7-3 MediaPlayer的状态图 getCurrentPosition() getDruation() getVideoWidth() getVideoHeight() setAudioStreamType() setLooping() setVolume() pause() start() stop() seekTo() prepare() prepareAsync() 对于不再需要的MediaPlayer对象,一定要通过调用release()方法使其进入到end状态,因为这关系到资源的释放问题。如果 MediaPlayer对象不释放硬件加速器等资源,随后创建的MediaPlayer对象就无法使用这唯一的资源,甚至导致创建失败。处于end状态的 MediaPlayer意味着它的生命周期终结,无法再回到其他状态了。 2. 初始化 在播放音频和视频之前必须对MediaPlayer进行初始化操作,这主要由两步工作完成。调用重载的setDataSource()方法将使 MediaPlayer对象进入到initialized状态,随后调用prepare()或者prepareAsync()方法将使 MediaPlayer对象进入到prepared状态。由于prepareAsync()方式是异步调用,因此通常为MediaPlayer注册 OnPreparedListener(),并在onPrepare()方法中启动播放器。当MediaPlayer对象处于prepared状态时,意味着调用者已经可以获得多媒体的时长等信息,此时可以调用MediaPlayer的相关方法设置播放器的属性。例如,调用setVolume(float leftVolume, float rightVolume)设置播放器的音量。 3. 播放、暂停和停止 调用start()方法,MediaPlayer将进入到started状态。isPlaying()方法可以用来判断MediaPlayer是否处在started状态。当MediaPlayer从网络上播放多媒体文件时,可以通过 onBufferingUpdateListener.onBufferingUpdate(MediaPlayer mp,int percent)来监听缓冲的进度,其中percent是0~100的整数,代表已经缓冲好的多媒体数据的百分比。 调用pause()方法,MediaPlayer将进入到paused状态。需要注意的是,从started到paused、从paused到 started状态的转换是异步过程,也就是说,可能经过一段时间才能更新MediaPlayer的状态。在调用isPlaying()来查询播放器的状态时需要考虑这一点。 调用stop()方法,MediaPlayer将进入到stopped状态。一旦MediaPlayer进入stopped状态,必须再次调用 prepare()或者prepareAsyn()才能使其进入到prepared状态,以便复用此MediaPlayer对象,再次播放多媒体文件。 4. 快进和快退 调用seekTo()方法可以调整MediaPlayer的媒体时间,以实现快退和快进的功能。seekTo()方法也是异步的,方法会立即返回,但是媒体时间调整的工作可能需要一段时间才能完成。如果为MediaPlayer设置了onSeekCompleteListener,那么 onSeekComplete()方法将被调用。需要说明的一点是,seekTo()不仅可以在started状态下调用,还可以在paused、 prepared和playbackCompleted状态下调用。 5. 播放结束状态 如果播放状态自然结束,MediaPlayer可能进入两种可能的状态。当循环播放模式设置为true时,MediaPlayer对象保持 started状态不变;当循环播放模式设置为false时,MediaPlayer对象的 onCompletionListener.onCompletion()方法会被调用,MediaPlayer对象进入到 playbackCompleted状态。对于处于playbackCompleted状态的播放器,再次调用start()方法,将重新播放音/视频文件。需要注意的是,当播放器结束时,音/视频的时长、视频的尺寸信息依然可以通过调用getDuration()、getVideoWidth()和 getVideoHeight()等方法获得。 6. 错误处理 在播放器播放音/视频文件时,可能发生各种各样的错误,比如IO错误、多媒体文件格式错误等。正确处理播放过程中的各种错误显得尤为重要。为了监听错误信息,可以为MediaPlayer对象注册onErrorListener监听器,当错误发生时,onErrorListener.onError()方法会被调用,MediaPlayer对象进入到error状态。如果希望复用 MediaPlayer对象并从错误中恢复过来,那么可以调用reset()方法使MediaPlayer再次进入到idle状态。总之,监视 MediaPlayer的状态是非常重要的,在错误发生之际提示用户,并恢复播放器的状态才是正确的处理方法。 除了上述的错误之外,如果在不恰当的时间调用了某方法,则会抛出IllegalStateException异常,在程序中应该使用try/catch块捕获到此类的编程错误。
分享到:
评论

相关推荐

    Android 媒体开发之MediaPlayer状态机接口方法实例解析

    Android 媒体开发之MediaPlayer状态机接口方法实例解析 Android 媒体开发之MediaPlayer状态机接口方法实例解析是 Android 媒体开发中一个非常重要的概念,它定义了MediaPlayer的状态机接口方法,帮助开发者更好地...

    Android程序设计-MediaPlayer介绍.pptx

    MediaPlayer状态间的转换 MediaPlayer具有多个状态,了解这些状态之间的转换对于正确使用MediaPlayer至关重要。主要状态包括: - **Idle**:初始化状态,未准备播放。 - **Initialized**:通过`setDataSource()`...

    Delphi使用MediaPlayer控件

    在本文中,我们将深入探讨如何在Delphi编程环境中使用MediaPlayer控件来实现音频播放功能。Delphi是一款强大的可视化开发工具,常用于创建Windows应用程序。MediaPlayer控件是Delphi提供的一种集成多媒体播放功能的...

    Android 使用MediaPlayer播放视频

    首先,`MediaPlayer`类是Android多媒体框架的一部分,它提供了丰富的功能,如播放本地和网络媒体文件、控制播放状态(播放、暂停、停止等)、调整音量以及处理各种播放事件。`MediaPlayer`的工作流程通常包括初始化...

    Android 带进度条的使用Service实现的音乐播放器

    在Android开发中,创建一个带有进度条的...这可能涉及到对MediaPlayer状态的准确管理,以及Service和Activity间同步更新的问题。改进这些问题可能需要更深入地理解MediaPlayer的工作原理和Android的多线程通信机制。

    MediaPlayer

    3. 控制播放:`pause()`用于暂停播放,`stop()`用于停止播放,而`reset()`会将MediaPlayer恢复到初始状态,释放所有资源。若要重新开始播放,通常需要重新准备。 4. 监听播放状态:可以通过实现`OnPreparedListener...

    安卓课学习项目.zip

    安卓课学习项目Android学习安卓课学习项目Lab4——MediaPlayer学习资料实现简单播放器startService与bindService的区别MediaPlayer状态图ObjectAnimator实现图片转动Animator官网ObjectAnimator官网实验5——...

    textureview播放视频

    总结来说,通过TextureView播放本地视频主要涉及到创建和配置TextureView、初始化和设置MediaPlayer的数据源、将TextureView与MediaPlayer绑定、监听MediaPlayer状态以及控制播放。TextureView的使用使得在Android...

    MediaPlayer(Android音视频播放器)

    MediaPlayer提供了控制播放状态的方法,如`pause()`暂停,`resume()`恢复,`stop()`停止,以及`seekTo()`跳转到指定位置。此外,还可以使用`setVolume()`调整音量。 ```java mediaPlayer.pause(); mediaPlayer....

    mediaplayer demo 播放暂停同一按钮

    4. **状态管理**: MediaPlayer有多个状态,如IDLE、INITIALIZED、PREPARING、PREPARED、STARTED、PAUSED等。在处理播放和暂停时,需要考虑到这些状态,以避免在错误的状态下进行操作,导致程序异常。 5. **按钮文本...

    mediaplayer

    5. 监听播放状态:通过实现`OnPreparedListener`、`OnErrorListener`等接口,可以监听MediaPlayer的各种事件,如准备完成、播放错误等。例如: ```java mediaPlayer.setOnPreparedListener(new MediaPlayer....

    android MediaPlayer播放视频网络URL,asset目录下文件,本地视频文件

    - `MediaPlayer`状态管理:了解其状态机(初始化、准备中、已准备、播放中、暂停、结束等)非常重要,以避免状态不匹配导致的问题。 - 错误处理:务必捕获异常并妥善处理,避免应用崩溃。 - 视频渲染:若需要在界面...

    android MediaPlayer+SurfaceView实现播放

    4. **监听事件**:`MediaPlayer` 提供了多个监听器,可以监听播放状态变化,如 `OnCompletionListener`(播放结束)、`OnErrorListener`(播放错误)、`OnBufferingUpdateListener`(缓冲更新)。这些监听器可以帮助...

    Android实例之MediaPlayer播放音乐和视频

    可能还会涉及监听MediaPlayer的状态变化,例如通过实现`OnPreparedListener`来监听准备完成事件,`OnCompletionListener`来监听播放结束事件。 此外,描述中提到了Delphi,这可能意味着这个实例也涵盖了如何在跨...

    android音乐播放器拖放播放进度设计

    4. **监听MediaPlayer状态** - 为了确保SeekBar的正确同步,我们需要监听`MediaPlayer`的状态,如播放、暂停和完成。在这些事件发生时,相应地更新SeekBar的状态。 5. **源码示例** ```java SeekBar seekBar; ...

    MediaPlayer源码

    `MediaPlayer`具有多个状态,如IDLE、INITIALIZED、PREPARING、PREPARED、STARTED、PAUSED、STOPPED、PlaybackCompleted等。理解这些状态转换对于正确控制媒体播放至关重要,例如,必须在`PREPARED`状态下才能调用`...

    Android下MediaPlayer播放MP3示例

    如果希望实现音乐播放列表功能,可以创建多个`MediaPlayer`实例,或者重用同一个实例并调用`reset()`方法清除当前状态,再设置新的数据源并准备播放。 最后,`MediaPlayerDemo`项目中的代码应该包含一个简单的...

    Android MediaPlayer

    `MediaPlayer`有多个状态,包括未初始化、初始化、准备中、已准备、播放中、暂停、结束等。开发者需要理解这些状态并正确处理状态转换,避免在错误状态下执行操作,比如在未准备好的状态下播放。 **四、事件监听** ...

    android mediaPlayer 实例 附

    这个示例可能包含了创建`MediaPlayer`对象、设置数据源、准备、播放、控制以及监听播放状态的基本步骤。具体代码可能涉及如何根据用户操作启动、暂停、停止播放,以及如何处理播放过程中的异常情况。 9. 性能优化...

Global site tag (gtag.js) - Google Analytics