返回

Android音视频(一): Camera2 API采集数据

Android

前言

欢迎来到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的基本使用技巧,后续文章我们将继续深入讲解音视频相关知识,敬请期待。