马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
心行慈善,何需积极看经—《西游记》
- Android Camera系列(一):SurfaceView+Camera
- Android Camera系列(二):TextureView+Camera
- Android Camera系列(三):GLSurfaceView+Camera
- Android Camera系列(四):TextureView+OpenGL ES+Camera
- Android Camera系列(五):Camera2
- Android Camera系列(六):MediaCodec视频编码上-编码YUV
- Android Camera系列(七):MediaCodec视频编码中-OpenGL ES多线程渲染
- Android Camera系列(八):MediaCodec视频编码下-OpenGL ES离屏渲染
本系列重要报告Android开发中Camera的干系利用、预览方式、视频录制等。项目结构简单、代码耦合性低,旨在资助各人能从中有所劳绩(方便copy :) ),对于个人来说也是一个总结的好机遇
一. Camera利用
Android体系存在这么多年,google更新了不少API。光是对摄像头的利用如今就有3种API:
- android.hardware.Camera:最早用来自界说Camera的API
- android.hardware.camera2.*:Android5.0之后保举使用的API,对Camera利用更机动,功能更丰富
- CameraX:对Camera2的封装,API更简单
由于Android版本浩繁,思量兼容性,本文我们还是对android.hardware.Camera举行讲授,利用Camera具体必要哪些步调呢?
- 设置Camera权限,Android6.0以上请动态申请
- 打开相机,Camera.open()
- 开始预览,startPreview
- 克制预览,stopPreview
- 关闭相机,release()
1. 打开相机
申请Camera权限,Android6.0以上记得在打开相机进步举措态申请
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android">
- <uses-permission android:name="android.permission.CAMERA" />
- <uses-feature android:name="android.hardware.camera" />
- ...
- </manifest>
复制代码 我们对Camera举行了简单的封装,无论是Camera还是Camera2我们预览视图都可以是SurfaceView、TextureView、GLSurfaceView,以是我们将Camera利用和预览视图举行分离,让预览View不在依靠具体的某种Camera实现
界说接口类ICameraManager:
- /**
- * Camera和Camera2通用接口
- *
- * @author xiaozhi
- * @since 2024/8/15
- */
- public interface ICameraManager {
-
-
- /**
- * 打开Camera
- */
- void openCamera();
- /**
- * 关闭释放Camera
- */
- void releaseCamera();
- /**
- * 开启预览
- *
- * @param surfaceHolder
- */
- void startPreview(SurfaceHolder surfaceHolder);
- /**
- * 开启预览
- *
- * @param surfaceTexture
- */
- void startPreview(SurfaceTexture surfaceTexture);
- /**
- * 停止预览
- */
- void stopPreview();
- ...
- }
复制代码 CameraManager实现ICameraManager,打开摄像头
- /**
- * 打开Camera
- */
- @Override
- public synchronized void openCamera() {
-
-
- Logs.i(TAG, "Camera open #" + mCameraId);
- if (mCamera == null) {
-
-
- if (mCameraId >= Camera.getNumberOfCameras()) {
-
-
- onOpenError(CAMERA_ERROR_NO_ID, "No camera.");
- return;
- }
- try {
-
-
- mCamera = Camera.open(mCameraId);
- Camera.getCameraInfo(mCameraId, mCameraInfo);
- mCamera.setErrorCallback(errorCallback);
- initCamera();
- onOpen();
- mOrientationEventListener.enable();
- } catch (Exception e) {
-
-
- onOpenError(CAMERA_ERROR_OPEN, e.getMessage());
- }
- }
- }
复制代码 打开摄像头之后我们可以设置摄像头的一些根本参数,如预览尺寸,照相尺寸等
- /**
- * 配置Camera参数
- */
- private void initCamera() {
-
-
- if (mCamera != null) {
-
-
- mParameters = mCamera.getParameters
复制代码 |