最近手上接了个小活儿,要做个东西能放视频。一开始我寻思这不就点个播放暂停嘛能有多复杂?结果一上手,把我给搞蒙了。那会儿真是两眼一抹黑,抓耳挠腮好几天都没个头绪。
本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu
最开始的时候,我脑子一热,想着肯定得找个什么牛逼的第三方库,什么功能都给配齐了的那种。于是乎就在网上各种搜刮,看见哪个名字炫酷就点进去看看。下载下来跑一遍,要么就是项目太庞大了,我这小破应用根本用不上那么多功能;要么就是文档写得跟天书似的,我这种菜鸟看了半天也摸不着北。折腾来折腾去,代码倒是敲了不少,但大部分时间都在适配和调试那些奇奇怪怪的bug,每天对着电脑屏幕,感觉头发都快掉光了。
有天晚上跟一个做了好些年开发的老哥打电话,吐槽我这视频播放器怎么搞都搞不顺。老哥听我抱怨完,特淡定地说了句:“你咋不用Android自带的那个`MediaPlayer`?那玩意儿虽然看着土点儿,但基本功能都有,而且稳定。”我一听,醍醐灌顶!我这脑子咋就没转过这个弯儿来?天天想着找外援,把自家门口的宝贝给忘了!
第二天一大早,我立马就把之前那些乱七八糟的库全删了,老老实实打开文档,开始研究`MediaPlayer`。我先是给自己定了个小目标,就是能把本地的一个视频文件跑起来,显示在屏幕上。
准备工作和初次尝试
- 我先找了个`SurfaceView`,这玩意儿就是个画布,视频画面最终得往这里面画。然后,实例化了一个`MediaPlayer`对象,这就是我的播放器本体。
- 得给播放器喂视频源。我找了个手机里现成的短视频,把它的路径给拿出来,用`setDataSource()`方法传了进去。
- 这一步之后,播放器得准备一下才能播。我用了`prepareAsync()`,异步准备,这样界面就不会卡死。然后就等着那个`OnPreparedListener`的回调,等到它告诉我“准备好了!”我就知道可以下一步了。
- 画面咋显示?这里得把`SurfaceView`的`SurfaceHolder`传给`MediaPlayer`,用`setDisplay()`方法,告诉它:“喏,就往这个地方画。”
- 一切就绪,我就大胆地调用了`start()`方法。奇了怪了,屏幕上还是黑的。我心里一咯噔,又出问题了?赶紧查资料,才发现我把`SurfaceHolder`的回调给忘了。在`surfaceCreated()`方法里,得把`setDisplay()`这步搞定才行。调整完再跑,嗡——视频画面终于出来了!那一刻,真是松了口气,感觉自己都快要起飞了!
深入折腾播放控制
能播放了还不算完,还得能控制。暂停、停止、快进快退,这些都得有。
- 暂停:想暂停的时候,就一个`pause()`方法,搞定。再想播放,又`start()`回去。
- 停止:`stop()`方法一调用,视频就停了,而且会把播放器重置到未准备状态,下次要播还得重新`prepareAsync()`。
- 快进快退:这个用的是`seekTo()`方法,给它传个毫秒数,它就能跳到视频的那个时间点。我搞了个滑动条,跟着滑动条的值去调`seekTo()`,就能实现视频的快进快退功能了。
处理各种监听和状态
光能播能控还不够,视频播放的时候,可能会遇到各种情况,比如播完了、出错了、缓冲了,这些都得能处理。`MediaPlayer`这块儿也给咱想到了,提供了各种监听器。
- `setOnCompletionListener()`:这个是监听视频播放完成的。我给它加了个逻辑,视频播完了就自动重头开始播,或者给个提示“播放完成”。
- `setOnErrorListener()`:这个就厉害了,能监听播放过程中出现的错误,比如视频文件损坏了,或者网络断了。一出问题,就能捕捉到,然后给用户一个友好的提示,不至于程序直接崩掉。
- `setOnBufferingUpdateListener()`:播放网络视频的时候,这个监听器就特别有用。它能告诉我当前视频缓冲了多少,我可以给用户显示一个缓冲进度条,体验就好很多。
- 还有`setOnVideoSizeChangedListener()`什么的,用来获取视频宽高,好调整`SurfaceView`的大小来适配视频,免得画面变形或者有黑边。
的收尾工作
做完这些,我发现还有个特别重要的事儿,就是资源释放。`MediaPlayer`是个比较耗费资源的家伙,你不用它的时候,一定要调用`release()`方法把它给释放掉。我把它放到了Activity的`onDestroy()`里面,这样界面销毁的时候,播放器也就跟着一起清清爽爽地释放了,避免内存泄漏,系统资源也得到了回收。
这么一套活儿下来,我才彻底明白了`MediaPlayer`是怎么玩的。虽然它不像那些第三方库那样功能特别多,包装得特别花哨,但对于我这种普通的应用需求来说,它真是又轻又好用。它让我从头到尾都清楚地知道每一步在做什么,遇到问题也知道往哪儿查。以前觉得视频播放是个挺高深的技术活儿,现在看来,只要掌握了这些基础,再深入一点去扩展,就没那么难了。有了这回的实践,以后再遇到类似的视频播放需求,心里就有底了,再也不慌了。