要捕获Android深度相机流(DEPTH16)作为OpenGL ES纹理,可以使用以下步骤:
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String[] cameraIds = cameraManager.getCameraIdList();
for (String cameraId : cameraIds) {
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
Integer depthStreamFormat = characteristics.get(CameraCharacteristics.DEPTH_DEPTH_IS_FORMAT_SUPPORTED);
if (depthStreamFormat != null && depthStreamFormat == CameraMetadata.DEPTH_DEPTH_IS_FORMAT_SUPPORTED) {
// 设备支持深度相机
}
}
cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// 深度相机已打开,创建相机预览会话
List outputSurfaces = new ArrayList<>();
SurfaceTexture texture = new SurfaceTexture(/* textureId */);
texture.setDefaultBufferSize(width, height);
Surface surface = new Surface(texture);
outputSurfaces.add(surface);
camera.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
// 相机预览会话已配置
session.setRepeatingRequest(captureRequest, captureCallback, backgroundHandler);
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
// 配置相机预览会话失败
}
}, backgroundHandler);
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
// 深度相机已断开连接
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
// 打开深度相机发生错误
}
}, backgroundHandler);
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
depthTextureId = textures[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, depthTextureId);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
private CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
// 获取深度相机流数据
Image depthImage = result.get(CaptureResult.DEPTH_IMAGE);
if (depthImage != null) {
// 将深度相机流数据绑定到纹理
SurfaceTexture texture = textureView.getSurfaceTexture();
texture.setDefaultBufferSize(depthImage.getWidth(), depthImage.getHeight());
Surface surface = new Surface(texture);
try {
ImageReader reader = ImageReader.newInstance(depthImage.getWidth(), depthImage.getHeight(), ImageFormat.DEPTH16, 1);
reader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image depthImage = reader.acquireLatestImage();
if (depthImage != null) {
// 将深度相机流数据绑定到纹理
SurfaceTexture texture = textureView.getSurfaceTexture();
texture.setDefaultBufferSize(depthImage.getWidth(), depthImage.getHeight());
Surface