原标题:用MediaPlayer+TextureView封装一个完美实现全屏、小窗口的视频播放器
本文作者
本文由xiaoyanger授权发布。
xiaoyanger的博客地址:
http://www.jianshu.com/u/25c3b13f87ce
贴个简易的效果图:
1
为什么使用TextureView
在Android总播放视频可以直接使用VideoView,VideoView是通过继承自SurfaceView来实现的。
SurfaceView的大概原理就是在现有View的位置上创建一个新的Window,内容的显示和渲染都在新的Window中。这使得SurfaceView的绘制和刷新可以在单独的线程中进行,从而大大提高效率。
但是呢,由于SurfaceView的内容没有显示在View中而是显示在新建的Window中, 使得SurfaceView的显示不受View的属性控制,不能进行平移,缩放等变换,也不能放在其它RecyclerView或ScrollView中,一些View中的特性也无法使用。
TextureView是在4.0(API level 14)引入的,与SurfaceView相比,它不会创建新的窗口来显示内容。它是将内容流直接投放到View中,并且可以和其它普通View一样进行移动,旋转,缩放,动画等变化。TextureView必须在硬件加速的窗口中使用。
TextureView被创建后不能直接使用,必须要在它被它添加到ViewGroup后,待SurfaceTexture准备就绪才能起作用(看TextureView的源码,TextureView是在绘制的时候创建的内部SurfaceTexture)。
通常需要给TextureView设置监听器SurfaceTextuListener:
SurfaceTexture的准备就绪、大小变化、销毁、更新等状态变化时都会回调相对应的方法。当TextureView内部创建好SurfaceTexture后,在监听器的onSurfaceTextureAvailable方法中,用SurfaceTexture来关联MediaPlayer,作为播放视频的图像数据来源。
SurfaceTexture作为数据通道,把从数据源(MediaPlayer)中获取到的图像帧数据转为GL外部纹理,交给TextureVeiw作为View heirachy中的一个硬件加速层来显示,从而实现视频播放功能。
2
MediaPlayer介绍
MediaPlayer是Android原生的多媒体播放器,可以用它来实现本地或者在线音视频的播放,同时它支持https和rtsp ( https://developer.android.google.cn/guide/topics/media/media-formats.html)。
MediaPlayer定义了各种状态,可以理解为是它的生命周期。
这个状态图描述了MediaPlayer的各种状态,以及主要方法调用后的状态变化。
MediaPlayer的相关方法及监听接口:
方法
介绍
状态
setDataSource
设置数据源
Initialized
prepare
准备播放,同步
Preparing —> Prepared
prepareAsync
准备播放,异步
Preparing —> Prepared