シナリオ:
できるだけ早く写真を撮り、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でいくつかのテストを行った後、結果は次のようになります。
- 画像サイズの設定: width=1600 height=1200
- JPEG 画質 : 70、画像フォーマット JPEG
- 火災の写真撮影: 00:13:23.603
- SD カードへの画像の保存を開始: 00:13:23.956
- SD カードへの画像の保存が完了しました: 00:13:23.990
これはほぼ 0.4 秒です。カメラのパラメータをさらに微調整して速度を上げる方法はありますか? 解像度もOK、画質もOK。毎秒 30 枚の画像を処理するアプリが市場に出回っていることは知っていますが、その速度を達成するためにバッファリングを使用していると思います。ただし、ご覧のとおり、写真をカードに保存するのではなく、写真を撮ることに最大の時間が費やされます。これをもう少し微調整できれば最高です。