【今更だけどandroid.hardware.Cameraを使う】Camera.Parametersの設定値 カメラプレビューのFPS(フレームレート)

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

android.hardware.Cameraを使うことで、Android端末にあるカメラデバイスにアクセスして使うことができます。
android.hardware.Cameraは、現在では非推奨となっていますがOpenCV等ではまだまだ使われています。

Android端末に実装されているカメラデバイスは固有の性能があります。
そのため、ある端末では出来るのに別の端末では出来ないということが多々あります。
今回はCamera.ParametersのFPS(フレームレート)に関連する設定値を説明します。
下記の実装はすべて前回までに作ったクラスを修正しています。

FPSとフレームレート

カメラデバイスから取得するプレビューのFPS(フレームレート)を指定することができます。
Camera.Parametersには新旧二つの設定値が存在します。
フレームレートは整数値の旧設定値で、それがそのままFPSとなります。現在ではフレームレートは非推奨となっています。
FPSは最小値と最大値を持つ新設定値で、カメラプレビューのフレームレートを範囲で指定することができます。
Camera.Parameters内にあるFPS(フレームレート)に関連するデータのキーは下記のとおりです。
preview-frame-rate-valuesカメラデバイスがサポートしているフレームレートリストのキーです。
preview-frame-rateカメラデバイスに現在設定されているフレームレートのキーです。
preview-fps-range-valuesカメラデバイスがサポートしているFPSのキーです。値には1000が掛けられた整数値が使われます。実際のFPSは1000で割った値です。
preview-fps-rangeカメラデバイスに現在設定されているFPSのキーです。値には1000が掛けられた整数値が使われます。実際のFPSは1000で割った値です。

カメラデバイスがサポートしているフレームレート

カメラデバイスがサポートしているフレームレートはList getSupportedPreviewFrameRates()で取得することができます。
    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        //サポートしているフレームレート
        List<Integer> supportedPreviewFrameRates = parameters.getSupportedPreviewFrameRates();
        for (int i = 0; i < supportedPreviewFrameRates.size(); i++) {
            Log.d(TAG, "SupportedPreviewFrameRates: "+ i + " / rate: " + supportedPreviewFrameRates.get(i));
        }
        mCamera.setParameters(parameters);
    }

フレームレートの取得と変更

フレームレートはint getPreviewFrameRate()で現在の値が取得できます。
また、void setPreviewFrameRate(int fps)を使ってフレームレートを変更することができます。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        //サポートしているフレームレート
        List<Integer> supportedPreviewFrameRates = parameters.getSupportedPreviewFrameRates();
        for (int i = 0; i < supportedPreviewFrameRates.size(); i++) {
            Log.d(TAG, "SupportedPreviewFrameRates: "+ i + " / rate: " + supportedPreviewFrameRates.get(i));
        }
        Log.d(TAG, "previewFrameRate: " + parameters.getPreviewFrameRate());
        parameters.setPreviewFrameRate(supportedPreviewFrameRates.get(0));
        mCamera.setParameters(parameters);
    }


カメラデバイスがサポートしているFPS

カメラデバイスがサポートしているFPSはList getSupportedPreviewFpsRange()で取得することができます。
FPSはint型の配列で表され、Camera.Parameters.PREVIEW_FPS_MIN_INDEXとCamera.Parameters.PREVIEW_FPS_MAX_INDEXの二つの要素を持ちます。
    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        //サポートしているFPS
        List<int[]> supportedPreviewFpsRange = parameters.getSupportedPreviewFpsRange();
        for (int i = 0; i < supportedPreviewFpsRange.size(); i++) {
            int[] ints = supportedPreviewFpsRange.get(i);
            Log.d(TAG, "SupportedPreviewFpsRange: "+ i + " / Min FPS: " + ints[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] + "/ Max FPS: " + ints[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
        }
        mCamera.setParameters(parameters);
    }

FPSの取得と変更

FPSはint型の配列をvoid getPreviewFpsRange(int[] range)に渡すことで現在の値が取得できます。
また、void setPreviewFpsRange(int min, int max)を使ってFPSを変更することができます。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        //サポートしているFPS
        List<int[]> supportedPreviewFpsRange = parameters.getSupportedPreviewFpsRange();
        for (int i = 0; i < supportedPreviewFpsRange.size(); i++) {
            int[] ints = supportedPreviewFpsRange.get(i);
            Log.d(TAG, "SupportedPreviewFpsRange: "+ i + " / Min FPS: " + ints[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] + "/ Max FPS: " + ints[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
        }

        int [] previewFpsRange = new int[2];
        parameters.getPreviewFpsRange(previewFpsRange);

        Log.d(TAG, "previewFrameRate: Min FPS: " + previewFpsRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] + "/ Max FPS: " + previewFpsRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
        parameters.setPreviewFpsRange(supportedPreviewFpsRange.get(0)[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],supportedPreviewFpsRange.get(0)[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
        mCamera.setParameters(parameters);
    }


FPS(フレームレート)の注意点

FPS(フレームレート)の設定値は下記の条件で例外が発生するので注意が必要です。
  1. Camera.Parameters#getSupportedPreviewFrameRatesとCamera.Parameters#getSupportedPreviewFpsRangeで取得した値以外の値を設定した状態でCamera#setParametersを使用すると例外が発生します。
  2. Camera.Parameters#removeで”preview-frame-rate”または”preview-fps-range”を削除した状態でCamera#setParametersを使用すると例外が発生します。