android 多媒体 监听,Android-多媒体之MediaPlayer原理

本文详细介绍了Android中的MediaPlayer组件的工作原理,包括其生命周期状态、错误监听机制、播放控制以及异步准备。在MediaPlayer的生命周期中,从Idle到Prepared状态需要调用setDataSource(),并建议捕获可能的异常。准备完成后,通过start()开始播放,使用OnBufferingUpdateListener监控缓冲。当播放结束或出现错误时,可以通过监听器进行处理。为了防止UI线程阻塞,推荐使用异步的prepareAsync()。最后,强调了及时释放MediaPlayer资源的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android-多媒体之MediaPlayer原理

一 MediaPlayer原理图

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

二 解析MediaPlayer原理

MediaPlayer控制状态

当MediaPlayer对象感new或者调用了restet()之后,即处于Idie状态

release()之后就处于end状态,这两个状态之间的生命周期不同

引入播放控制的侦听机制:

我们通常会遇到下面个中复杂的问题:

播放格式不允许,文件格式损坏,视频分辨率过高,流超时等

为了有效的帮助我们检测并且处理这些错误,当然需要一套错误的监听机制:

setOnErrorListener(android.media.MediaPlayer.OnErrorListener)

调用setDataSource()方法会将MediaPlayer对象从IDel状态转为Initialized状态:

1.只要是Idel之外的所有状态调用setDataSource就出现IllegalStateException

2.建议调用setDataSource()方法的时候捕获IllegalStateException和IOException异常

MediaPlayer必须先要进入prepared状态才可以start:

同步prepare()

异步prepareAsync和sOnPreparedListener(android.media.MediaPlayer.onPrepareListener)

preparing是一个机器短暂的状态

在prepared状态,可以调用相应的方法调整Volume,sceenOnWhilePalying. looper等

调用start进入started状态,可以调用isPlaying判断是否是started状态:

播放过程中可以用

setOnBufferingUpdateListener(OnBufferingUpdateListener)

但是正在播放中调用start()无效果

started状态可以调用pause(),stop进入暂停和停止状态:

正在播放中调用pause()进入到pause状态异步需要一点时间,甚至是几秒钟

paused状态调用pause()无效果

调用stop()可以让started,paused,prepared或者PlaybackCompleted状态进入到stopped状态

一旦stopped,流程有效果

stopped状态调用stop()无效果

通过seekTo(int)调整播放的进度:

调用后同样需要一些时间才能真正执行结束

播放到达流终点,播放停止:

如果设定了自动循环,这状态会自动改变为started

如果setLooping(false),则监听setOnCompletionListener(OnCompletionListener)

PalybackCompleted状态,直接调用start()可以重新播放

二 使用异步准备perpareAsync

prepare也需要花时间,一般情况下比较短,但是对于UI的主线程来说,即使是0.5秒,也不短

因为他有时候会包含识别和解码文件,就是耗时间的操作

因此:不要在UI线程直接调用prepare(),很容易引起ANR

所以:开启另一个线程,准备好后通知UI线程(handler)

或者使用perpareAsync()异步准备(一般采用这种方法)

四 MediaPlayer的释放

MediaPlayer会占用大量的关联职员,

因此不用了要及时的释放,释放方式:

mMediaPlayer.release();

mMediaPlayer = null;

五 使用后台服务

0818b9ca8b590ca3270a3433284dd417.png

六 使用wake lock

0818b9ca8b590ca3270a3433284dd417.png

七 运行前台服务

0818b9ca8b590ca3270a3433284dd417.png

八 操作声音焦点

声音间的切换就是切换声音的焦点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值