用手机看视频已经是家常便饭,但自己动手开发一个视频播放器却让不少Android开发者头疼。其实,掌握正确的方法后,你会发现它比你想象中简单得多。
01 SurfaceView与MediaPlayer的完美搭档
在Android系统中,播放视频主要有两种方式:一是使用系统自带的播放器,二是使用VideoView,但效果最好的还是SurfaceView+MediaPlayer的组合。
那么,为什么需要SurfaceView和MediaPlayer两者合作呢?
这就像看电视一样,SurfaceView是电视机屏幕,负责显示画面;MediaPlayer则是DVD播放机,负责解码和播放视频流。
单独的MediaPlayer只能播放音频文件,要想播放视频还需要SurfaceView来配合显示画面。
SurfaceView从Android 1.0就有了,它有一个独特的优势:可以在非UI线程中完成刷新。这样一来,在播放视频时就不需要自己去写handler来实现两个线程之间的通信了。
这种显示与控制分离的机制使得SurfaceView只负责显示画面,而不负责控制视频流,因此还需要SurfaceHolder来控制视频流。
02 MediaPlayer的生命周期与状态管理
想要熟练使用MediaPlayer,首先必须理解它的生命周期。MediaPlayer有一套非常明确的状态转换规则,了解这些状态对于正确使用MediaPlayer至关重要。
从MediaPlayer的生命周期图,可以看出使用MediaPlayer不是很复杂。
最简单的流程:初始化->reset()->setDataSource()->prepare()->start()->……只要简单的几步,就可以播放音频文件了。
当创建MediaPlayer对象时,它处于Idle(空闲)状态;调用setDataSource()方法后,MediaPlayer进入Initialized(已初始化)状态。
接着,调用prepare()或prepareAsync()方法使MediaPlayer进入Prepared(已准备)状态,此时可以调用start()方法开始播放。
在播放过程中,可以通过pause()方法暂停播放,进入Paused(已暂停)状态,再调用start()方法又会回到播放状态。
当播放完成后,MediaPlayer进入PlaybackCompleted(播放完成)状态,此时可以通过seekTo()方法重新定位到某个位置并再次播放。
最后,当不再需要MediaPlayer时,必须调用release()方法释放相关资源,否则会造成内存泄漏。
03 一步步构建Android视频播放器
了解了基本概念后,让我们实际动手构建一个完整的视频播放器。
基本布局设计
首先,我们需要设计一个简单的界面,包含一个SurfaceView和几个控制按钮:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="400dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_Play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放" />
<Button
android:id="@+id/btn_Pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停" />
<Button
android:id="@+id/btn_Stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止" />
</LinearLayout>
</LinearLayout>
初始化MediaPlayer与SurfaceHolder
接下来,在Activity中初始化MediaPlayer和SurfaceView:

最低0.47元/天 解锁文章
1325

被折叠的 条评论
为什么被折叠?



