转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/58582919 
  • SurfaceView是什么 ?

  • SurfaceView优点及缺点?

  • SurfaceView中双缓冲?

  • TextureView是什么?

  • TextureView优点及缺点?

  • 两者的性能相比如何?

  • 播放器应该选择谁?

SurfaceView是什么?

它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有对应的WindowState,在SurfaceFlinger中有Layer。我们知道,一般的Activity包含的多个View会组成View hierachy的树形结构,只有最顶层的DecorView,也就是根结点视图,才是对WMS可见的。这个DecorView在WMS中有一个对应的WindowState。相应地,在SF中对应的Layer。而SurfaceView自带一个Surface,这个Surface在WMS中有自己对应的WindowState,在SF中也会有自己的Layer。虽然在App端它仍在View hierachy中,但在Server端(WMS和SF)中,它与宿主窗口是分离的。这样的好处是对这个Surface的渲染可以放到单独线程去做,渲染时可以有自己的GL context。这对于一些游戏、视频等性能相关的应用非常有益,因为它不会影响主线程对事件的响应。但它也有缺点,因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。

SurfaceView优点及缺点

优点:可以在一个独立的线程中进行绘制,不会影响主线程

使用双缓冲机制,播放视频时画面更流畅

缺点:Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中。SurfaceView 不能嵌套使用

SurfaceView中双缓冲

双缓冲:在运用时可以理解为:SurfaceView在更新视图时用到了两张Canvas,一张frontCanvas和一张backCanvas,每次实际显示的是frontCanvas,backCanvas存储的是上一次更改前的视图,当使用lockCanvas()获取画布时,得到的实际上是backCanvas而不是正在显示的frontCanvas,之后你在获取到的backCanvas上绘制新视图,再unlockCanvasAndPost(canvas)此视图,那么上传的这张canvas将替换原来的frontCanvas作为新的frontCanvas,原来的frontCanvas将切换到后台作为backCanvas。例如,如果你已经先后两次绘制了视图A和B,那么你再调用lockCanvas()获取视图,获得的将是A而不是正在显示的B,之后你讲重绘的C视图上传,那么C将取代B作为新的frontCanvas显示在SurfaceView上,原来的B则转换为backCanvas。

TextureView是什么

在4.0(API level 14)中引入,与SurfaceView一样继承View,     它可以将内容流直接投影到View中,它可以将内容流直接投影到View中,可以用于实现Live preview等功能。和SurfaceView不同,它不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。值得注意的是TextureView必须在硬件加速的窗口中。它显示的内容流数据可以来自App进程或是远端进程。从类图中可以看到,TextureView继承自View,它与其它的View一样在View hierachy中管理与绘制。TextureView重载了draw()方法,其中主要SurfaceTexture中收到的图像数据作为纹理更新到对应的HardwareLayer中。SurfaceTexture.OnFrameAvailableListener用于通知TextureView内容流有新图像到来。SurfaceTextureListener接口用于让TextureView的使用者知道SurfaceTexture已准备好,这样就可以把SurfaceTexture交给相应的内容源。Surface为BufferQueue的Producer接口实现类,使生产者可以通过它的软件或硬件渲染接口为SurfaceTexture内部的BufferQueue提供graphic buffer。

TextureView优点及缺点

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

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

谁的性能更优?

播放器应该选择谁?

从性能和安全性角度出发,使用播放器优先选SurfaceView。

1、在android 7.0上系统surfaceview的性能比TextureView更有优势,支持对象的内容位置和包含的应用内容同步更新,平移、缩放不会产生黑边。 在7.0以下系统如果使用场景有动画效果,可以选择性使用TextureView

2、由于失效(invalidation)和缓冲的特性,TextureView增加了额外1~3帧的延迟显示画面更新

3、TextureView总是使用GL合成,而SurfaceView可以使用硬件overlay后端,可以占用更少的内存带宽,消耗更少的能量

4、TextureView的内部缓冲队列导致比SurfaceView使用更多的内存

5、SurfaceView: 内部自己持有surface,surface 创建、销毁、大小改变时系统来处理的,通过surfaceHolder 的callback回调通知。当画布创建好时,可以将surface绑定到MediaPlayer中。SurfaceView如果为用户可见的时候,创建SurfaceView的SurfaceHolder用于显示视频流解析的帧图片,如果发现SurfaceView变为用户不可见的时候,则立即销毁SurfaceView的SurfaceHolder,以达到节约系统资源的目的

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

视频画面帧的展示控件SurfaceView及TextureView对比相关推荐

  1. 项目实训—基于AI的智能视频剪辑器(九)展示视频画面帧并进行视频剪切

    文章目录 前言 视频全部画面帧的获取与显示 视频滑动选取框 RangeSeekBarView 的实现 根据起始终止时间进行视频的截取 前言 对于后端返回的每一个视频片段,前端需要保证用户可以对其进行剪 ...

  2. Android 绿豆通讯录【 SQLite数据库(增删改查、展示数据) + ListView数据展示控件(展示所有数据) 】

    前情提要:Android 数据库(SQLite) [简介.创建.使用(增删改查.事务.实战演练).数据显示控件(ListView.Adapter.实战演练-绿豆通讯录)] https://blog.c ...

  3. Android微信九宫格图片展示控件

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/214 Android微信九宫格图片展示控件 半年前,公司产 ...

  4. 模仿微信九宫格图片展示控件

    主题 仿微信九宫格图片展示控件 github地址:点击打开链接 使用方法以及源码都在github上面

  5. android从九宫格全屏预览,仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图...

    AssNineGridView 仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图(可自定义). 写在前面 这是一个九宫格控件,本来是很久之前就写好了,现在才开源出来,也是看了很多优秀 ...

  6. 陈伟视频——(20—25)控件

    ## 陈伟视频-(20-25)控件 陈伟视频20 控件介绍 Active租件 -ActiveX文档 -代码组件(OLE自动化) -控件 ·内部控件 ·ActiveX控件 ·第三方控件 DLL动态链接库 ...

  7. WinFrm程序使用的图片展示控件.带删除的

    界面很简单.  新建一个用户控件. 然后再拖一个WebBrowser 控件. 边框什么的.通通为none 先上个使用后的效果图片 上代码 [System.Runtime.InteropServices ...

  8. viewpage显示服务器图片,照片查看器——ViewPager实现的图片展示控件

    1.使用场景 需要使用到照片查看功能的时候 2.效果 缩放动画.gif 完整过程和平移动画.gif 3.思路 PhotoPagerView的思路.png 实现思路其实很简单,利用已知的ViewPage ...

  9. Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结...

    一.SurfaceView SurfaceView继承自View,并提供了一个独立的绘图层,你可以完全控制这个绘图层,比如说设定它的大小,所以SurfaceView可以嵌入到View结构树中,需要注意 ...

  10. 浅谈ASP.NET 4中构造“.NET研究”HTML5视频控件

    在本文中,将一步步地指导你如何使用Visual Studio 2010和ASP.NET 4的相关知识,打造一个基于HTML5标准规范的视频播放控件,其中你会学习到一些关于HTML 5的知识,还会学到如 ...

最新文章

  1. php怎么将表格导出到excel表格,php怎么将excel表格数据-php 怎么把数据导出到excel表格...
  2. mysql查询结果单位换算后小数位数的保留方式
  3. 第十届 蓝桥杯样题 ——结果填空
  4. Modbus协议栈开发笔记之二:Modbus消息帧的生成
  5. 阿里巴巴云原生混部系统 Koordinator 正式开源
  6. 用到f6的快捷键_让你的办公效率成倍翻得快捷键。
  7. http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码
  8. Excel(XLS,XLSX)和CSV相互转换 - C#简单实现方案
  9. Nordic--nrf52832--FDS(一)基本介绍
  10. MATLAB符号运算小技巧
  11. MATLAB读取xls文件的内容
  12. ruoyi默认的端口8080被占用,修改前后端端口号
  13. Unity ADB调试和一些常用命令
  14. 堆外内存(直接内存)
  15. Android APK反编译及逆向工程
  16. 《软件设计的哲学》(十九)【代码应该是显而易见的】
  17. java iw_java知识回顾 - osc_iwr5mti2的个人空间 - OSCHINA - 中文开源技术交流社区
  18. falagard cegui
  19. PMP@第六版项目管理视频课程项目整体管理-乔俊峰-专题视频课程
  20. 罗伯沃茨机器人_罗伯沃茨CSO张东芙:无人驾驶的下个十年,依旧沧海桑田 | GGAI专访...

热门文章

  1. 修改对象的某个属性的值_如何理解Python中的面向对象编程?
  2. WebSocket(1)---WebSocket介绍
  3. 使用Apache commons-pool2实现高效的FTPClient连接池的方法
  4. sql2005 脚本中给字段写说明
  5. 深度学习笔记_卷积神经网络基本概念
  6. [jQuery]计算年龄
  7. shell 判断目录还是文件
  8. [设计模式]装饰者模式
  9. jQuery之筛选函数
  10. 车间调度建模系列5|扩展析取图之工序间物流周转时间