随着快手,抖音,西瓜视频等视频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配合解析渲染视频流的帧图像:
  

SurfaceHolder

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中管理与绘制。

SurfaceTexture

TextureView重载了draw()方法,其中主要SurfaceTexture中收到的图像数据作为纹理更新到对应的HardwareLayer中。SurfaceTexture.OnFrameAvailableListener用于通知TextureView内容流有新图像到来。SurfaceTextureListener接口用于让TextureView的使用者知道SurfaceTexture已准备好,这样就可以把SurfaceTexture交给相应的内容源。

Surface

Surface为BufferQueue的Producer接口实现类,使生产者可以通过它的软件或硬件渲染接口为SurfaceTexture内部的BufferQueue提供graphic buffer。

TextureView优点

支持移动、旋转、缩放等动画,支持截图

TextureView缺点

必须在硬件加速的窗口中使用,占用内存比SurfaceView高,在5.0以前在主线程渲染,5.0以后有单独的渲染线程。

推荐阅读

Android进阶:自定义视频播放器开发(下)

福利

需要相关教学视频及源码,可以加vx:mm1591314250,免费领取一下,欢迎一起学习交流
q.com/doc/DSkNLaERkbnFoS0ZF)

福利

需要相关教学视频及源码,可以加vx:mm1591314250,免费领取一下,欢迎一起学习交流

Android进阶:自定义视频播放器开发(上)相关推荐

  1. Android进阶:自定义视频播放器开发(下)

    上一篇文章我们主要讲了视频播放器开发之前需要准备的一个知识,TextureView,用于对图像流的处理.这篇文章开始构建一个基础的视频播放器. 一.准备工作 在之前的文章已经说过了,播放器也是一个vi ...

  2. Android开发笔记(一百二十五)自定义视频播放器

    视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置 ...

  3. 《android多媒体api》之MediaPlayer自定义视频播放器

    <android多媒体api>系列是整合梳理android开发中经常用到的媒体相关api:多媒体开发主要内容有音频.视频录制播放.摄像头操作.录制操作.流媒体.直播.推流.拉流等方面:最近 ...

  4. 实现在Android本地视频播放器开发

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  5. Android本地视频播放器开发--视频解码

    在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...

  6. android 编译 sdl,SDL编译 - Android本地视频播放器开发_Linux编程_Linux公社-Linux系统门户网站...

    在上一章  Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)[http://www.linuxidc.com/Linux/2013-06/85955p5.htm]中使用Ope ...

  7. Android自定义视频播放器(三)

    参看:Android自定义视频播放器(一):https://blog.csdn.net/zxd1435513775/article/details/81507909 参看:Android自定义视频播放 ...

  8. Android本地视频播放器开发--NDK编译FFmpeg

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  9. 记一次Android视频播放器开发

    播放器入门 看小电影多年 当年甚至还是用QTplayer:而李开复,已经从技术员,技术总监,HR,出书,风投,隐退的华丽转身 而我们还只是个"程序员" 这么多年过去了,好像还真没认 ...

最新文章

  1. sonarqube7.8汉化教程:安装中文插件
  2. [BZOJ 3931][CQOI2015]网络吞吐量(SPFA+网络流)
  3. 作用域、执行环境、闭包(四)
  4. python 复制文件并重命名_好书推荐 | Python 如此神奇,让繁琐工作自动化
  5. ionic应用程序文件保存和清除缓存
  6. Hessian的使用与介绍
  7. 实时渲染学习(十)渲染加速算法总结
  8. CR渲染器全景图如何渲染颜色通道_【3D】日不落投影灯 VR/CR投影效果制作
  9. java 软键盘_【学习笔记】【java appium】软键盘搜索、回车按钮
  10. IT:如何把骨干留住
  11. IT农民工如何来美国工作(续)
  12. thingsboard 规则引擎结点功能总结
  13. 故宫避开人流游玩的 4 个诀窍
  14. 计算机网络:ALOHA协议
  15. 怎么回答TCP的三次握手问题
  16. VLAN--虚拟局域网
  17. 《汇编语言》学习笔记
  18. 除了Xshell,还有哪些趁手的Linux终端工具
  19. 《高等统计物理学》Cookbook(持续更新)
  20. Python的皮肤的使用

热门文章

  1. 郑伟峰谈:房地产企业应当全面“触网”,逐步摆脱渠道绑架
  2. Omni Recover 1.3.5 Ios数据恢复工具 http://www.macxiazai.cn/downloads/omni-recover-1-3-5/
  3. 借助江苏电信欢go进行流量推广活动合作的工作规范(一)
  4. 使用线程池插入数据报Could not open JDBC Connection for transaction 异常
  5. Video Super-Resolution with Recurrent Structure-Detail Network阅读笔记
  6. 这是一款有味道的APP
  7. FileUtils工具类的使用方法
  8. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击激活配置进入到运行模式直接死机或蓝屏怎么办
  9. vb用txt打开html文件,VB打开记事本程序源码,即用VB调用记事本,或用记事本打开一个txt文本文件。...
  10. C#通过邮箱验证来找回密码