Сценарий:
Мне нужно сделать снимок как можно быстрее и сохранить его на SD-карте. Было бы фантастически, если бы я мог сделать это примерно за 0,2 секунды, сняв фотографию и сохранив ее.
Что я сделал до сих пор:
Как обычно, я создал SurfaceView для обработки предварительного просмотра камеры и инициализации объекта камеры. Качество изображения не должно быть очень высоким, поэтому я не использую максимально возможное разрешение, а также не требуется автофокусировка. Я задал параметры следующим образом:
Parameters parameters = camera.getParameters();
parameters.set("jpeg-quality", 70);
parameters.setPictureFormat(ImageFormat.JPEG);
List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
Size size = sizes.get(Integer.valueOf((sizes.size()-1)/2)); //choose a medium resolution
parameters.setPictureSize(size.width, size.height);
camera.setParameters(parameters);
camera.setDisplayOrientation(90);
List<Size> sizes2 = parameters.getSupportedPreviewSizes();
Size size2 = sizes.get(0);
parameters.setPreviewSize(size2.width, size2.height);
camera.setPreviewDisplay(holder);
camera.startPreview();
Я сохраняю изображение на SD-карте очень просто:
PictureCallback handlePictureStorage = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
outStream.write(data);
outStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
};
После нескольких тестов на моем Galaxy Nexus результат выглядит следующим образом:
- Настройка размера изображения: wigth = 1600 height = 1200
- Качество JPEG: 70, Формат изображения JPEG
- Пожар снимать на: 00: 13: 23.603
- Начало сохранения изображения на SD-карте: 00: 13: 23.956
- Готовое сохранение изображения на SD-карте: 00: 13: 23.990
Это почти 0,4 секунды. Есть ли способ настроить параметры камеры еще больше, чтобы получить более высокую скорость? Разрешение в порядке, качество изображения также. Я знаю, что есть приложения на рынке, которые имеют 30 кадров в секунду, но я думаю, что они используют буферизацию для достижения этой скорости. Однако, как вы видите, самое большое время теряется при съемке, а не в сохранении карты. Было бы здорово, если бы я мог настроить это немного больше.