OpenGL 在相机中的使用也是非常广泛的,可以通过OpenGL给相机的预览数据做滤镜、美颜、水印、结合多纹理的渲染,可以实现很多的拍摄特效。所以,接下来会把之前的openGL基础知识都串联起来,做出一个OpenGL在Camera中的应用示例。
OpenGL预览摄像头数据的原理是利用OpenGL生成纹理并绑定到SurfaceTexture,然后把Camera的预览数据设置显示到SurfaceTexture中,这样就可以在OpenGL中拿到摄像头数据并显示了。
先看效果:

其实这里就是对Camera知识的扩展了,不过我们只是把Camera当作是OpenGL的一种应用场景,OpenGL的应用场景有很多。现在要灵活的配合Camera应用OpenGL,还需要对一些安卓Camera的知识有所了解。所以,我先概括一下Camera的基础知识及要点,后面如果还有时间,我再出一个安卓Camera系列的总结,看能不能也做成一个通俗易懂的教程。
1.安卓Camera基本知识及概念
一般,如果只是想简单的实现拍照和拍视频功能,可以利用Intent打开系统提供的功能。
拍摄照片:MediaStore.ACTION_IMAGE_CAPTURE ;
拍摄视频:MediaStore.ACTION_VIDEO_CAPTURE ;
但是如果要定制相机功能,那就会用到安卓Camera相关的api了
安卓有2套Camera API,其兼容性如下:
API 21以下:android.hardware.Camera(已过时)
API 21以上:android.hardware.Camera2
安卓Camera可以利用设备的相机来预览画面,拍照和录制视频,如果需要自动对焦功能,就要加入相应的权限。
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WEITE_EXTERNAL_STORAGE" />
2.Camera1相关知识
2.1 使用步骤
Camera1的使用步骤一般为以下几步:
- 利用open(int cameraID)获取Camera实例
- 利用getParameters()获取默认设置
- 利用setParameters(Camera.Parameters)进行参数设置
- 利用setDisplayOrientation(int)函数设置正确的预览方向
- 预览图像,可以配合SurfaceView,利用setPreviewDisplay(SurfaceHolder)设置SurfaceView的SurfaceHolder用于预览;也可以加入openGL进行图像渲染。
- 调用startPreview()开始预览
- takePicture 拍摄照片
- 调用takePickture后预览会停止,想要继续预览就再调用- - startPreview()函数
- 调用stopPreview()停止预览
- 调用release()释放资源,可在onPause调用停止预览,在onResume开始预览。
3.Camera2 相关知识点
3.1重要的类
- CamaraManager
- CameraDevice
- CameraCuptureSession
- CameraCharacteristics
- CuptureRequest
- ImageRender
- Listsurfaces
3.2使用步骤
①TextrueView.setSurfaceTextureListner()
onSurfaceTextureAvailable(SurfaceTexture surface,w,h);
②获取CameraDevice对象
CameraManager.openCamera("0",new CameraStateCallback)
onOpened(CameraDevice cameraDevice);
③获取CameraCaptureSsion对象
cameraDevice.createCapatureSsion(surfaces,CameraCaptureSession.StateCallback)
onConfigured( CameraCaptureSession session);
④创建会话
val captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
val surface = Surface(mTextureView.surfaceTexture)
captureRequestBuilder.addTarget(surface) // 将CaptureRequest的构建器与Surface对象绑定在一起
captureRequestBui

本文详细介绍了如何使用OpenGL渲染Camera的预览数据,包括Camera1和Camera2 API的使用方法,OpenGL纹理绑定过程,以及如何在OpenGL环境中显示Camera画面。
2506

被折叠的 条评论
为什么被折叠?



