Android Texture 相关
首先你明白 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 相关相关推荐
- Android Pmem相关介绍
http://fangjian0518.blog.163.com/blog/#m=0 Android Pmem相关介绍 2011-10-18 09:40:26| 分类: Android PMEM | ...
- nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)
from: http://wszf.net/archives/2012/11/07/80510.html 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16个分区(s ...
- android 内核内存管理,Android内核相关内容总结
要想充分掌握Android这一操作系统的应用,首先需要我们从Android内核的相关内容开始了解.在这里就为大家详细介绍一下相关的知识. Android操作系统是由谷歌推出的一款基于Linux平台开源 ...
- Android 蓝牙相关的广播
2019独角兽企业重金招聘Python工程师标准>>> Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和 ...
- Android 指纹相关调研
Android 指纹相关调研 背景:公司产品同学提出要接入指纹,用于登录场景,提高转化率,由于之前没接触过指纹,接下来就是指纹的相关调查. 一:指纹的优势 我们传统的登录方式,需要用户输入用户名和密码 ...
- 关于Android Launcher3相关优秀文章的记录
关于Android Launcher3相关优秀文章的记录 Android M Launcher3主流程源码浅析 (主要分析主题流程,不涉及代码) Android Launcher3源码分析与修改 (偏 ...
- android蓝牙广播自定义,Android 蓝牙相关的广播
Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice类中, 可以通过在AndroidManife ...
- Android telephony相关
Android telephony相关 subid和slotid(phoneid) slotid(phoneid)是指卡槽:双卡机器的卡槽1值为0,卡槽2值为1,依次类推. subid:Subscri ...
- 基于Android的相关毕业设计和论文
基于Android的相关毕业设计和论文 今年整理了一下关于基于android的相关毕业设计的信息,这里和大家分享一下,总共分为5大模块: 一.基于android的毕业设计题目整理,供大家学习参考 基于 ...
最新文章
- php 多条数据更新数据类型,PHPdoc @param中的两个或多个数据类型
- this指针_c++11新特性之智能指针
- get pid and kill
- Hot Door CADtools (基础篇)
- python必读_学好Python必读的几篇文章
- 基础集合论 第一章 5 偶集
- 定推【好处】篇,牵手定推,好处多多
- 买房注意事项收集(zt)
- Android 11.0 修改下拉通知栏的NotificationGuts背景为圆角背景
- 循环小题题库存档(期末复习)
- vue前端实现语音提示功能
- OC load 和 initialize 方法
- 【转】通过VIOS实现AIX系统的网络虚拟化
- DC(Design Compiler)使用说明
- Variant 数据类型介绍
- 将计算机放在什么地方英语,怎么把电脑设置为英文版的系统
- clear both
- IdentityServer4系列(05)【授权方式】
- nas系统存储服务器,企业搭建NAS存储服务器的三部曲,你都清楚嘛?
- uml建模工具 支持php,【UML 建模】在线UML建模工具 ProcessOn 使用详解