-
Notifications
You must be signed in to change notification settings - Fork 0
SurfaceView
- 使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型
- 使用android自带的VideoView,这种方法太简单就不介绍了
- 使用SurfaceView+MediaPlayer,这种方式效果比较好
SurfaceView从android 1.0就有了,十分好用。一般来说,UI对刷新都需要在UI线程中完成,但是,surfaceview可以在非UI线程中完成刷新。这样以来就很方便了,比如在线播放,就不需要自己去写handler来实现两个线程之间的通信了,直接可以在非UI线程中播放视频。
SurfaceView和大部分视频应用一样,把视频流解析成一帧帧的图像进行 显示,但是如果把这个解析的过程放到一个线程中完成,可能在上一帧图像已经显示过后,下一帧图像还没有来得及解析,这样会导致画面的不流畅或者声音和视频 不同步的问题。所以SurfaceView和大部分视频应用一样,通过双缓冲的机制来显示帧图像。那么什么是双缓冲呢?双缓冲可以理解为有两个线程轮番去 解析视频流的帧图像,当一个线程解析完帧图像后,把图像渲染到界面中,同时另一线程开始解析下一帧图像,使得两个线程轮番配合去解析视频流,以达到流畅播 放的效果。
SurfaceView内部实现了双缓冲的机制,但是实现这个功能是非常消耗系统内存的。因为移动设备的局限性,Android在设计的时候规 定,SurfaceView如果为用户可见的时候,创建SurfaceView的SurfaceHolder用于显示视频流解析的帧图片,如果发现 SurfaceView变为用户不可见的时候,则立即销毁SurfaceView的SurfaceHolder,以达到节约系统资源的目的。
如果开发人员不对SurfaceHolder进行维护,会出现最小化程序后,再打开应用的时候,视频的声音在继续播放,但是不显示画面了的情况,这 就是因为当SurfaceView不被用户可见的时候,之前的SurfaceHolder已经被销毁了,再次进入的时候,界面上的 SurfaceHolder已经是新的SurfaceHolder了。所以SurfaceHolder需要我们开发人员去编码维护,维护 SurfaceHolder需要用到它的一个回调,SurfaceHolder.Callback(),它需要实现三个如下三个方法:
void surfaceDestroyed(SurfaceHolder holder):当SurfaceHolder被销毁的时候回调。 void surfaceCreated(SurfaceHolder holder):当SurfaceHolder被创建的时候回调。 void surfaceChange(SurfaceHolder holder):当SurfaceHolder的尺寸发生变化的时候被回调。
在应用中分别为SurfaceHolder实现了这三个方法,先进入应用,SurfaceHolder被创建,创建 好之后会改变SurfaceHolder的大小,然后按Home键回退到桌面销毁SurfaceHolder,最后再进入应用,重新 SurfaceHolder并改变其大小。
步骤:
- 调用player.setDataSource()方法设置要播放的资源,可以是文件、文件路径、或者URL。
- 调用MediaPlayer.setDisplay(holder)设置surfaceHolder,surfaceHolder可以通过surfaceview的getHolder()方法获得。
- 调用MediaPlayer.prepare()来准备。
- 调用MediaPlayer.start()来播放视频。