使用Android Camera2 API在没有预览的情况下拍摄视频,可以参考以下解决方法:
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String[] cameraIds = cameraManager.getCameraIdList();
String cameraId = cameraIds[0]; // 选择需要使用的摄像头ID
CameraCaptureSession.StateCallback sessionCallback = new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
// 相机会话已配置完成
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
// 相机会话配置失败
}
};
cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// 相机已打开
// 创建预览请求
camera.createCaptureSession(Arrays.asList(surface), sessionCallback, null);
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
// 相机断开连接
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
// 相机打开错误
}
}, null);
MediaRecorder mediaRecorder = new MediaRecorder();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(outputFile.getAbsolutePath());
mediaRecorder.setVideoEncodingBitRate(10000000);
mediaRecorder.setVideoFrameRate(30);
mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight());
CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
captureBuilder.addTarget(surface);
captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
cameraDevice.createCaptureSession(Arrays.asList(surface, mediaRecorder.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
// 相机会话已配置完成
session.setRepeatingRequest(captureBuilder.build(), null, null);
mediaRecorder.start(); // 开始录制
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
// 相机会话配置失败
}
}, null);
mediaRecorder.stop();
mediaRecorder.reset();
session.close();
cameraDevice.close();
以上是一个简单的使用Camera2 API在没有预览的情况下拍摄视频的解决方法。注意,这只是一个基本示例,实际应用中可能还需要处理异常、权限等其他逻辑。
上一篇:Android Camera2 API如何在相机的内置自动对焦程序中获取初始对焦点距离?
下一篇:Android Camera2 CameraAvailabilityHandler调用cameraAvailable然后cameraUnavailable