Я пытаюсь запустить и играть с Android Camera2 API, используя демо здесь: https://github.com/googlesamples/android-Camera2Basic
Как я вижу, демонстрационная программа использует список размеров и автоматически выбирает один для предварительного просмотра и один для размера видео на основе соотношения:
CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
... try ...
String cameraId = manager.getCameraIdList()[0];
// Choose the sizes for camera preview and video recording
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics
.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
if (map == null) {
throw new RuntimeException("Cannot get available preview/video sizes");
}
Size[] outputSizes = map.getOutputSizes(MediaRecorder.class);
mVideoSize = chooseVideoSize(outputSizes);
Size[] previewSizes = map.getOutputSizes(SurfaceTexture.class);
mPreviewSize = chooseOptimalSize(previewSizes,
width, height, mVideoSize);
Проблема в том, что некоторые разрешения недоступны. Например, для моей Galaxy J7 (android 8.1) камера может снимать видео с разрешением 1072x1072, но этого нет в списке доступных разрешений. Если я попытаюсь установить это разрешение самостоятельно на медиа-рекордере, произойдет сбой конфигурации:
private MediaRecorder mMediaRecorder;
...
mMediaRecorder.setVideoSize(1072, 1072);
А вот метод onConfigureFailed, вызываемый при попытке записи.
mCameraDevice.createCaptureSession( Collections.singletonList(previewSurface),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
mPreviewSession = session;
updatePreview();
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
Activity activity = getActivity();
if (null != activity) {
Toast.makeText(activity, "Failed", Toast.LENGTH_SHORT).show();
}
}
}, mBackgroundHandler);
Однако, если я использую параметры размера видео с помощью API-интерфейса Camera1, я получаю различные параметры:
Camera camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
Camera.Parameters camParams = camera.getParameters();
// Find a preview size that is at least the size of our IMAGE_SIZE
List<Camera.Size> supportedPreviewSizes = camParams.getSupportedPreviewSizes();
Camera.Size previewSize = supportedPreviewSizes.get(0);
Одним из них действительно является разрешение 1072x1072, которое можно использовать с моим приложением по умолчанию для камеры.
Я пытаюсь использовать соотношение сторон 1: 1, но единственное разрешение для этого при использовании camera2 api - 3088x3088, что слишком велико. Есть ли в любом случае, я могу решить это?