[6]Opengl ES预览摄像头

术语:

VertexShader:顶点着色器,用来描述图形图像位置的顶点坐标;

FragmentShader:片元着色器,用来给顶点指定的区域进行着色;

Vertex:顶点

Texture:纹理,给顶点区域进行渲染的材质,比如图像等;

这一节通过前面学习的知识,我们直接采用纹理用Opengl ES来对摄像头进行预览,要实现这个功能,需要解决如下问题:

1)摄像头数据怎么采集到纹理?

2)摄像头数据更新时怎么收到通知?

3)采集到的摄像头数据纹理渲染到屏幕?

首先,我们要明白,摄像头采集到的视屏数据格式一般是YUV的,而Opengl ES能处理的数据是RGB格式的,那怎么样直接到把摄像头数据采集到纹理呢?还记得前面我们讲过,Opengl ES2.0有两种类型的纹理:GL_TEXTURE_2D和GL_TEXTURE_EXTERNAL_OES。而GL_TEXTURE_EXTERNAL_OES这种类型纹理就是处理这种格式转换的,摄像头采集的数据可以直接放到GL_TEXTURE_EXTERNAL_OES这种类型的纹理。

解决了摄像头数据映射纹理的问题,下面看下实现Opengl ES预览摄像头数据的流程图:

  1. 没错,SurfaceTexture就是摄像头到纹理的数据通道,通过把承载纹理的SurfaceTexture对象设置给摄像机Camera,在底层Camera就会源源不断的把数据采集到SurfaceTexture承载的纹理上,关键代码如下:

int textureId = GLES20.glGenTexture();

SurfaceTexture texSurface = new SurfaceTexture(textureId);

camear.setSurfaceTexture(texSurface);

老规矩,上面的代码仅仅是说明流程的伪代码,详细代码看对应工程的说明。

  1. 摄像头对应的数据映射到纹理后,接下来我们要接收摄像头源源不断的一帧一帧的数据,通过给SurfaceTexture设置侦听回调接口,当有摄像头数据到达时,我们可以收到通知,代码片段如下:

texSurface.setFrameAvaiableListenre();

  1. 收到数据到达消息后,需要通过调用texSurface.updateTexImage()来把数据更新到纹理,这里要注意,不能直接在回调接口调用此方法,因为这个方法不一定是创建纹理的线程调用,换句话说,此方法必须在创建纹理的线程里调用,具体为什么前面讲过了,这里再提一下,因为涉及到Opengl ES的API调用都必须在当前线程关联的EGLContext上操作,因为EGLContext保存了所有调用的状态,好看,下面是代码片段:

  2. 把纹理渲染到屏幕,这里流程和渲染一般的纹理差不多,区别就是片元着色器里的纹理对象是samplerExternalOES,而不是普通的sampler2D,片元着色器代码如下:

#extension GL_OES_EGL_image_external : require

precision mediump float;

uniform samplerExternalOES texture; // 定义扩展的的纹理取样器

varying vec2 vTexCoor;

void main ()

{

vec4 color = texture2D(texture, vTexCoor);

gl_FragColor = color;

}

到这里,我们就完成了使用Opengl ES的纹理来实现摄像头的视屏预览功能,接下来的章节,我会在此基础上采用FBO实现以及摄像头在多个Surface上预览等功能。

相关推荐
Lucky_556688几秒前
山东捷瑞检测科技有限公司:政务信息化项目监理要点与收费标准解析
大数据·人工智能
熊文豪2 分钟前
给国产数据库装上中文搜索引擎:zhparser vs jieba 分词实战,与三个隐藏关卡
数据库·搜索引擎·电科金仓
REDcker12 分钟前
Git浅克隆详解与实践
大数据·git
陕西企来客1 小时前
陕西企来客科技 AI 营销大模型深度解析:GEO 赛道技术优势与落地实践
大数据·人工智能·科技
MartinYeung51 小时前
[论文学习]Unsafe LLM-Based Search: AI搜索引擎安全风险的定量分析与缓解
人工智能·学习·搜索引擎
石像鬼₧魂石1 小时前
钢结构ERP管理系统 —— 玻璃拟态 · 单文件HTML(系统为开发测试虚拟数据)
大数据·数据仓库·制造·数据库开发·数据库架构
软件技术新观察1 小时前
2026年北京教育医疗小程序与APP定制开发:十大服务商实力测评
大数据·小程序
石像鬼₧魂石1 小时前
贵州商会管理系统 —— 商协会数字化运营一站式平台
大数据·数据结构·物联网·eclipse·数据库架构
jkyy201411 小时前
深耕AI健康医疗数据智库,赋能企业构建主动健康管理新生态
大数据·人工智能·健康医疗
2601_9619460813 小时前
AI API 网关实战:从单 Key 管理到企业级多租户架构
大数据·人工智能·金融·架构·api·个人开发