首先你明白 Android 中的相关控件的定义和区别吗?

SurfaceView: 因此它本质上是一个View。但与普通View不同的是,它有自己的Surface

GLSurfaceView:作为SurfaceView的补充。它可以看作是SurfaceView的一种典型使用模式。

SurfaceTexture: 和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此可用于图像流数据的二次处理(如Camera滤镜,桌面特效等). Android中,Camera设备、视频解码器等都可以产生图像流,SurfaceTexture从图像流中捕获视频帧并转换成GLES纹理。SurfaceTexture在创建的时候需要一个texture对象,捕获到的视频帧会更新到纹理,然后就可以利用GPU的能力进行高效的图像处理。SurfaceTexture将Surface和Texture结合在了一起:SurfaceTexture的构造需要texture对象;利用SurfaceTexture对象可以创建Surface;对Surface进行渲染同样可以把内容更新到对应的texture上。

TextureView:它可以将内容流直接投影到View中,可以用于实现Live preview等功能。和SurfaceView不同,它不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。

Android的图形系统底层使用BufferQueue作为基础组件。Surface通常与一个BufferQueue关联,当渲染到Surface上时,结果最终将出现在传送给消费者的缓冲区中。可以把Surface理解成图像生产者一侧的接口,图像生产者通过渲染的动作把图像传递给与Buffer的消费者。

EGL 的一些API

Opengl ES中我们使用最多的有两种类型的纹理:

TEXTURE_2D: 标准的RGB格式图像数据

TEXTURE_EXTERNAL_OES,Android特有的OES纹理,预览相机或者视频使用此纹理,通过SurfaceTexture来转换得到,而摄像头采集获得的数据一般是YUV格式的,事实上,通过查看Opengl的源码我们知道,Android底层对TEXTURE_EXTERNAL_OES这种类型的纹理是经过特殊转换的

Texture 使用的大概流程

// 1. create texure
    final int texture[] = new int[i];
    glGenTextures(1, texture, 0);
    final int texId = texture[0];
    glBindTexture(GL_TEXTURE_EXTERNAL_OES, texId);
    
    // 2. create SurfaceTexture
    SurfaceTexture st = new SurfaceTexture(texId);
    
    // 3. set listener
    st.setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() {
        @Override
        public void onFrameAvailable(SurfaceTexture surfaceTexture) {
            // notify new Frame arrival
            a.  surfaceTexture.updateTexImage(); 
            b.  OES | 2D  ->  ProvideCameraTexture
        }
    }, handler);  // specify a thread for onFrameAvailable execution
    
    // 4. use SurfaceTexture to capture camera preview frame
    mCamera.setPreviewTexture(st);

编码

Surface inputSurface = mediaCodec.createInputSurface();
eglBase.createSurface(inputSurface);

1. Create TextureID ->  SurfaceTexture(texture ID) -> camera.setPreviewTexture (surfaceTexutre)  (surfaceTexture 不会显示图像)

2. Get share EGLContext  -> mediaCodec.createInputSurface() -> eglBase.createSurface & new GlRectDrawer

3. EglBase.makeCurrent -> GlRectDrawer.drawRgb/Oes by TextureID ,  则 Texture Data 会进入 mediaCodec

4. DequeueOutputBuffer ( releaseOutputBuffer.false) -> network send

Video Downlink:

1. OpenGl ES create Texture ID, SurfaceTexture(id) 绑定这个ID

2. Surface init with surfaceTexture

3. MediaCodec.create with Surface

4. Set listener with {  onTextureFrameAvailable ...   oes -> copy and save  |   2d -> textureCopy  RGB data bigger than yuv }

5. releaseOutputBuffer -> render:false

6.  eglBase.makeCurrent();  &&  eglBase.makeCurrent();

7.  GlRectDrawer.drawRgb or drawOes  -> eglBase.swapBuffers();

Android Texture 相关相关推荐

  1. Android Pmem相关介绍

    http://fangjian0518.blog.163.com/blog/#m=0 Android Pmem相关介绍 2011-10-18 09:40:26|  分类: Android PMEM | ...

  2. nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)

    from: http://wszf.net/archives/2012/11/07/80510.html 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16个分区(s ...

  3. android 内核内存管理,Android内核相关内容总结

    要想充分掌握Android这一操作系统的应用,首先需要我们从Android内核的相关内容开始了解.在这里就为大家详细介绍一下相关的知识. Android操作系统是由谷歌推出的一款基于Linux平台开源 ...

  4. Android 蓝牙相关的广播

    2019独角兽企业重金招聘Python工程师标准>>> Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和 ...

  5. Android 指纹相关调研

    Android 指纹相关调研 背景:公司产品同学提出要接入指纹,用于登录场景,提高转化率,由于之前没接触过指纹,接下来就是指纹的相关调查. 一:指纹的优势 我们传统的登录方式,需要用户输入用户名和密码 ...

  6. 关于Android Launcher3相关优秀文章的记录

    关于Android Launcher3相关优秀文章的记录 Android M Launcher3主流程源码浅析 (主要分析主题流程,不涉及代码) Android Launcher3源码分析与修改 (偏 ...

  7. android蓝牙广播自定义,Android 蓝牙相关的广播

    Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice类中, 可以通过在AndroidManife ...

  8. Android telephony相关

    Android telephony相关 subid和slotid(phoneid) slotid(phoneid)是指卡槽:双卡机器的卡槽1值为0,卡槽2值为1,依次类推. subid:Subscri ...

  9. 基于Android的相关毕业设计和论文

    基于Android的相关毕业设计和论文 今年整理了一下关于基于android的相关毕业设计的信息,这里和大家分享一下,总共分为5大模块: 一.基于android的毕业设计题目整理,供大家学习参考 基于 ...

最新文章

  1. php 多条数据更新数据类型,PHPdoc @param中的两个或多个数据类型
  2. this指针_c++11新特性之智能指针
  3. get pid and kill
  4. Hot Door CADtools (基础篇)
  5. python必读_学好Python必读的几篇文章
  6. 基础集合论 第一章 5 偶集
  7. 定推【好处】篇,牵手定推,好处多多
  8. 买房注意事项收集(zt)
  9. Android 11.0 修改下拉通知栏的NotificationGuts背景为圆角背景
  10. 循环小题题库存档(期末复习)
  11. vue前端实现语音提示功能
  12. OC load 和 initialize 方法
  13. 【转】通过VIOS实现AIX系统的网络虚拟化
  14. DC(Design Compiler)使用说明
  15. Variant 数据类型介绍
  16. 将计算机放在什么地方英语,怎么把电脑设置为英文版的系统
  17. clear both
  18. IdentityServer4系列(05)【授权方式】
  19. nas系统存储服务器,企业搭建NAS存储服务器的三部曲,你都清楚嘛?
  20. uml建模工具 支持php,【UML 建模】在线UML建模工具 ProcessOn 使用详解

热门文章

  1. Linux运维03:ps命令详解
  2. SAP小技巧之 建立你自己的SPRO
  3. jquery中断(取消/abort)ajax请求
  4. Arduino—— 4*4按键
  5. FPGA是什么?FPGA现状?怎样学习FPGA?
  6. [资源汇总] 85个PACS精华资源汇总【2010年HC3i年终盘点】
  7. qsort函数排序数据 and 模拟实现qosrt函数的功能(详解)
  8. 使图片变成灰色CSS
  9. 基于深度学习的人脸识别闸机开发(基于飞桨PaddlePaddle)
  10. html两个文本框怎么重叠,ppt文本框字体重叠怎么解决