
随着快手,抖音,西瓜视频等视频APP的崛起,视频播放已经成为主流,此时作为AndroID研发的你,想要提高自己的能力还不知道怎么开发视频播放器怎么行?所以今天就带着大家一起开发一个简易播放器:SmallVIDeoPlayer
需求分析我们观察一个视频播放器,可以看到视频播放器除了正在播放的视频还有很多控件,比如播放按钮,暂停按钮,播放进度条,播放计时器等。
这么多控件显然无法播放视频,但是他们都在控制视频的播放。由此可见视频播放器可以分为两层,一层为视频播放器控制层,一层为真正的视频播放层。
所以实现视频播放器的时候就可以分为上层控制层,和底层播放层两层来实现。
视频播放器播放层实现 技术沉淀 视频播放内核我们知道自己开发视频播放器内核肯定是不现实的,这需要一定的技术成本,单个人很难达到,所以我们就选择一个最受欢迎的开源的内核即可:bilibili开源的视频播放器:ijkplayer
视频播放器视频播放这块需要给大家普及两个知识点:
SurfaceVIEw先来介绍一下大部分软件如何解析一段视频流。首先它需要先确定视频的格式,这个和解码相关,不同的格式视频编码不同,不是这里的重点。知道了视频的编码格式后,再通过编码格式进行解码,最后得到一帧一帧的图像,并把这些图像快速的显示在界面上,即为播放一段视频。SurfaceVIEw在AndroID中就是完成这个功能的。
既然SurfaceVIEw是配合MediaPlayer使用的,MediaPlayer也提供了相应的方法设置SurfaceVIEw显示图片,只需要为MediaPlayer指定SurfaceVIEw显示图像即可。它的完整API如下:
voID setdisplay(SurfaceHolder sh);
它需要传递一个SurfaceHolder对象,SurfaceHolder可以理解为SurfaceVIEw装载需要显示的一帧帧图像的容器,它可以通过SurfaceHolder.getHolder()方法获得。
使用MediaPlayer配合SurfaceVIEw播放视频的步骤与播放使用MediaPlayer播放MP3大体一致,只需要额外设置显示的SurfaceVIEw即可。
SurfaceVIEw双缓冲上面有提到,SurfaceVIEw和大部分视频应用一样,把视频流解析成一帧帧的图像进行显示,但是如果把这个解析的过程放到一个线程中完成,可能在上一帧图像已经显示过后,下一帧图像还没有来得及解析,这样会导致画面的不流畅或者声音和视频不同步的问题。所以SurfaceVIEw和大部分视频应用一样,通过双缓冲的机制来显示帧图像。那么什么是双缓冲呢?双缓冲可以理解为有两个线程轮番去解析视频流的帧图像,当一个线程解析完帧图像后,把图像渲染到界面中,同时另一线程开始解析下一帧图像,使得两个线程轮番配合去解析视频流,以达到流畅播放的效果。
下图为演示了双缓冲的过程,线程A和线程B配合解析渲染视频流的帧图像:
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并改变其大小。\
SurfaceVIEw的优点:如上面所说,SurfaceVIEw可以在一个独立的线程中进行绘制,不会影响主线程,并且使用双缓冲机制,播放视频时画面更流畅。
SurfaceVIEw的缺陷:因为这个Surface不在VIEw hIErachy中,它的显示也不受VIEw的属性控制,所以不能进行平移,缩放等变换,也不能放在其它VIEwGroup中,一些VIEw中的特性也无法使用。
TextureVIEw与SurfaceVIEw一样继承VIEw,它可以将内容流直接投影到VIEw中,可以用于实现live prevIEw等功能。
和SurfaceVIEw不同的是,它不会在WMS中单独创建窗口,而是作为VIEw hIErachy中的一个普通VIEw,因此可以和其它普通VIEw一样进行移动,旋转,缩放,动画等变化。
值得注意的是TextureVIEw必须在硬件加速的窗口中。它显示的内容流数据可以来自App进程或是远端进程。从类图中可以看到,TextureVIEw继承自VIEw,它与其它的VIEw一样在VIEw hIErachy中管理与绘制。
SurfaceTextureTextureVIEw重载了draw()方法,其中主要SurfaceTexture中收到的图像数据作为纹理更新到对应的HarDWareLayer中。SurfaceTexture.OnFrameAvailableListener用于通知TextureVIEw内容流有新图像到来。SurfaceTextureListener接口用于让TextureVIEw的使用者知道SurfaceTexture已准备好,这样就可以把SurfaceTexture交给相应的内容源。
SurfaceSurface为BufferQueue的Producer接口实现类,使生产者可以通过它的软件或硬件渲染接口为SurfaceTexture内部的BufferQueue提供graphic buffer。
TextureVIEw优点支持移动、旋转、缩放等动画,支持截图
TextureVIEw缺点必须在硬件加速的窗口中使用,占用内存比SurfaceVIEw高,在5.0以前在主线程渲染,5.0以后有单独的渲染线程。
总结以上是内存溢出为你收集整理的Android进阶:自定义视频播放器开发(上)全部内容,希望文章能够帮你解决Android进阶:自定义视频播放器开发(上)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)