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


    一、SurfaceView

    SurfaceView继承自View,并提供了一个独立的绘图层,你可以完全控制这个绘图层,比如说设定它的大小,所以SurfaceView可以嵌入到View结构树中,需要注意的是,由于SurfaceView直接将绘图表层绘制到屏幕上,所以和普通的View不同的地方就在与它不能执行Transition,Rotation,Scale等转换,也不能进行Alpha透明度运算。

    SurfaceView的Surface排在Window的Surface(也就是View树所在的绘图层)的下面,SurfaceView嵌入到Window的View结构树中就好像在Window的Surface上强行打了个洞让自己显示到屏幕上,而且SurfaceView另起一个线程对自己的Surface进行刷新。需要注意的是SurfaceHolder.Callback的所有回调方法都是在主线程中回调的。

    SurfaceView、SurfaceHolder、Surface的关系可以概括为以下几点:

    • SurfaceView是拥有独立绘图层的特殊View。
    • Surface就是指SurfaceView所拥有的那个绘图层,其实它就是内存中的一段绘图缓冲区。
    • SurfaceView中具有两个Surface,也就是我们所说的双缓冲机制
    • SurfaceHolder顾名思义就是Surface的持有者,SurfaceView就是通过过SurfaceHolder来对Surface进行管理控制的。并且SurfaceView.getHolder方法可以获取SurfaceView相应的SurfaceHolder。
    • Surface是在SurfaceView所在的Window可见的时候创建的。我们可以使用SurfaceHolder.addCallback方法来监听Surface的创建与销毁的事件。

    Surface的渲染可以放到单独线程去做,渲染时可以有自己的GL context。这对于一些游戏、视频等性能相关的应用非常有益,因为它不会影响主线程对事件的响应。但它也有缺点,因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。

    二、TextureView

    TextureView专门用来渲染像视频或OpenGL场景之类的数据的,而且TextureView只能用在具有硬件加速的Window中,如果使用的是软件渲染,TextureView将什么也不显示。也就是说对于没有GPU的设备,TextureView完全不可用。

    TextureView 有两个相关类 SurfaceTexture、Surface,下面说明一下几者相关的特点:

    • Surface就是SurfaceView中使用的Surface,就是内存中的一段绘图缓冲区。
    • SurfaceTexture用来捕获视频流中的图像帧的,视频流可以是相机预览或者视频解码数据。SurfaceTexture可以作为android.hardware.camera2, MediaCodec, MediaPlayer, 和 Allocation这些类的目标视频数据输出对象。可以调用updateTexImage()方法从视频流数据中更新当前帧,这就使得视频流中的某些帧可以跳过。
    • TextureView可以通过getSurfaceTexture()方法来获取TextureView相应的SurfaceTexture。但是最好的方式还是使用TextureView.SurfaceTextureListener监听器来对SurfaceTexture的创建销和毁进行监听,因为getSurfaceTexture可能获取的是空对象。

    三、GLSurfaceView

    GLSurfaceView作为SurfaceView的补充,可以看作是SurfaceView的一种典型使用模式。在SurfaceView的基础上,它加入了EGL的管理,并自带了渲染线程。另外它定义了用户需要实现的Render接口,提供了用Strategy pattern更改具体Render行为的灵活性。作为GLSurfaceView的Client,只需要将实现了渲染函数的Renderer的实现类设置给GLSurfaceView即可。

    四、SurfaceTexture

    SurfaceTexture和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此可用于图像流数据的二次处理(如Camera滤镜,桌面特效等)。比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。首先,SurfaceTexture从图像流(来自Camera预览,视频解码,GL绘制场景等)中获得帧数据,当调用updateTexImage()时,根据内容流中最近的图像更新SurfaceTexture对应的GL纹理对象,接下来,就可以像操作普通GL纹理一样操作它了。

    五、参考文章

    1. http://blog.csdn.net/holmofy/article/details/66578852
    2. http://blog.csdn.net/Holmofy/article/details/66583879
    3. https://www.cnblogs.com/wytiger/p/5693569.html
  • 相关阅读:
    leetcode 17 Letter Combinations of a Phone Number
    剑指offer 数字翻译成字符串
    剑指offer 把数组排成最小的数
    剑指offer 整数中1出现的次数(从1到n整数中1出现的次数)
    剑指offer 数据流中的中位数
    RNN, LSTM, GRU cells
    剑指offer 最小的K个数
    PWA-网络
    PWA-缓存
    2018 总结
  • 原文地址:https://www.cnblogs.com/renhui/p/8258391.html
Copyright © 2020-2023  润新知