タイムラプス撮影を行う


「MediaRecorderで録画する」で録画する方法を説明しましたが、今回はそのコードを元にしてタイムラプス撮影を行う方法を説明します。

タイムラプス撮影を行うにはAPIレベル11から追加されたMediaRecorder#setCaptureRateメソッドを利用します。

※タイムラプス撮影とは長い時間をかけて少しずつ動いていく対象を、一定時間ごとに1フレームずつ、ゆっくりと撮影していく方法です。撮影を終えた映像を通常の30fps(フレーム/秒)で再生することで早送りと同様の効果が得られます。

専用のビデオカメラで1時間に1フレームを撮影するなどの設定もできますが、AndroidでMediaRecorderを用いた方法では1秒間に数フレーム撮影するところまでしか速度を落とせません。用途が限られてしまうかもしれませんがアイデア次第で活用できる機能だと思います。

今回のサンプルコードはこちらになります。

それでは続きでサンプルコードを説明します。

プロファイルの設定

タイムラプス撮影を行うにはまずMediaRecorder#setProfileでタイムラプス用のProfileを設定する必要があります。
ProfileはCamcorderProfile#getで取得します。ライムラプス用のProfileを得るには以下の値のいずれかを指定することになります。値は解像度を示しますが、端末によってどの解像度に対応しているかは異なるため、CamcorderProfile#hasProfileにて対応しているかを確認することが望まれます。

  • QUALITY_TIME_LAPSE_1080P
  • QUALITY_TIME_LAPSE_480P
  • QUALITY_TIME_LAPSE_720P
  • QUALITY_TIME_LAPSE_CIF
  • QUALITY_TIME_LAPSE_HIGH
  • QUALITY_TIME_LAPSE_LOW
  • QUALITY_TIME_LAPSE_QCIF

このMediaRecorder#setProfileは、MediaRecorder#setVideoSource/setAudioSourceで入力ソースを設定し、MediaRecorder#setOutputFileで出力ファイルを設定するまでの間に呼び出す必要があります。

サンプルでは720P(1280×720 プログレッシブスキャン)を指定しています。

myRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); // 録画の入力ソースを指定
myRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_720P));
myRecorder.setOutputFile(Environment.getExternalStorageDirectory().toString() + "/sample.mp4"); // 動画の出力先となるファイルパスを指定

※CamcorderProfileクラスに関してはhttp://developer.android.com/intl/ja/reference/android/media/CamcorderProfile.htmlを参照してください。

キャプチャレートの設定

MediaRecorder#setCaptureRateで1秒間に何フレームキャプチャ(撮影)するかを設定します。

myRecorder.setCaptureRate(4); // 1秒間に4フレームだけキャプチャする

設定できる値(FPS)は端末によって異なります。
Cameraクラスからパラメータを取得し、Parameters#getPreviewFpsRangeまたはParameters#getSupportedPreviewFpsRangeで設定できるFPSの上限と下限を確認します。

サンプルではコメントアウトしていますが下記のようにFPSの上限と下限を確認しています。
参考までにモトローラ製のタブレット端末であるXOOMでは、上限、下限がそれぞれ35FPS、4FPSでした。

Camera camera = Camera.open();
Parameters parameters = camera.getParameters();
int fps[] = new int[2];
parameters.getPreviewFpsRange(fps);
Log.e("TimeLapse", String.valueOf(fps[0]));
Log.e("TimeLapse", String.valueOf(fps[1]));
camera.release()

※Parametersクラスに関してはhttp://developer.android.com/intl/ja/reference/android/hardware/Camera.Parameters.htmlを参照してください。