Android音视频(一): Camera2 API采集数据
2023-11-22 09:32:04
前言
欢迎来到Android音视频系列第一篇文章,我们终于回到老本行了。之前好像从来没有做过Camera相关的开发,所以从头开始学起。在Android API21中,Google发布了Camera2来取代原本的Camera,两者之间的变化很大。
Camera2 API简介
Camera2 API是一个强大的多摄像头API,可以更精确地控制摄像头,它提供了许多Camera没有的功能,例如:
- 手动对焦
- 手动曝光
- RAW图像捕获
- 多摄像头支持
Camera2 API是一个异步API,这意味着当您调用API时,它会立即返回,而实际操作可能需要一段时间。例如,当您调用capture()
方法时,它会立即返回,但实际的图像捕获可能需要几百毫秒。
获取Camera2实例
要获取Camera2实例,您可以使用CameraManager
类。CameraManager
类是一个系统服务,您可以使用getSystemService()
方法来获取它。
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
获取CameraManager
实例后,您可以使用getCameraIdList()
方法来获取可用摄像头的ID列表。
String[] cameraIdList = cameraManager.getCameraIdList();
打开Camera2
要打开Camera2,您可以使用CameraManager
类的openCamera()
方法。
CameraDevice cameraDevice = cameraManager.openCamera(cameraId, cameraStateCallback, null);
cameraId
是要打开的摄像头的ID,cameraStateCallback
是一个回调,当摄像头的状态发生变化时会被调用,null
表示不使用Handler来处理回调。
预览数据
要预览数据,您可以使用CameraCaptureSession
类的setRepeatingRequest()
方法。
CaptureRequest.Builder previewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewRequestBuilder.addTarget(surface);
CameraCaptureSession cameraCaptureSession = cameraDevice.createCaptureSession(Arrays.asList(surface), cameraCaptureSessionStateCallback, null);
cameraCaptureSession.setRepeatingRequest(previewRequestBuilder.build(), null, null);
surface
是要显示预览数据的SurfaceView,cameraCaptureSessionStateCallback
是一个回调,当CameraCaptureSession的状态发生变化时会被调用,null
表示不使用Handler来处理回调。
采集数据
要采集数据,您可以使用CameraCaptureSession
类的capture()
方法。
CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(imageReader.getSurface());
CameraCaptureSession cameraCaptureSession = cameraDevice.createCaptureSession(Arrays.asList(imageReader.getSurface()), cameraCaptureSessionStateCallback, null);
cameraCaptureSession.capture(captureRequestBuilder.build(), null, null);
imageReader
是要存储采集数据的ImageReader,cameraCaptureSessionStateCallback
是一个回调,当CameraCaptureSession的状态发生变化时会被调用,null
表示不使用Handler来处理回调。
总结
至此,我们已经初步了解了Camera2 API的基本使用技巧,后续文章我们将继续深入讲解音视频相关知识,敬请期待。