「MediaRecorderで録音する」ではMediaRecorderを使った音声の記録について紹介しました。
MediaRecorderでは音声の記録と同じような手順でカメラからの映像を記録することが可能です。
MediaRecorderの状態遷移
録音の場合と同様に録画の場合でもMediaRecorderは以下のような状態遷移図に従って動作します。
状態に応じて適切なメソッドを呼び出すことで、次の状態へと遷移します。
録画に関連するメソッドとサンプルコードの紹介は続きからどうぞ。
録画に関連するメソッド
録画を行うために必要なメソッドは以下のようなものがあります。
エンコーディングの方式や出力するファイルのフォーマットなどを指定するメソッドが用意されています。
- setVideoSource : 録画の入力ソースを指定
- setVideoEncoder : ビデオエンコーダを指定
- setOutputFile : 出力ファイルを指定
- setVideoSize : 動画のサイズ(width, height)を正の整数で指定
- setVideoFrameRate : 動画のフレームレートを正の整数で指定
- setPreviewDisplay : 録画中のプレビューに使用するSurfaceを指定
- setOutputFormat : 出力フォーマットを指定
- prepare : 録画準備
- start : 録画開始
- stop : 録画開始
- reset : アイドル状態に戻る。オブジェクトは解放しない。
- release : オブジェクトの解放
これらのメソッドをさきほどの状態遷移図の順番で呼び出すことで、
録画が行えるようになります。
サンプルコード
録画した映像をMPEG4-SPでエンコードして、3GPP形式のファイルとしてSDカードに
保存したい場合は以下のようなコードになります。
また、フレームレートは30fps、動画のサイズは320×240に設定しています。
// MediaRecorderの初期設定
public void initializeMediaRecorder() {
myRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); // 録画の入力ソースを指定
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // ファイルフォーマットを指定
myRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); // ビデオエンコーダを指定
myRecorder.setOutputFile("/sdcard/sample.3gp"); // 動画の出力先となるファイルパスを指定
myRecorder.setVideoFrameRate(30); // 動画のフレームレートを指定
myRecorder.setVideoSize(320, 240); // 動画のサイズを指定
myRecorder.setPreviewDisplay(v_holder.getSurface()); // 録画中のプレビューに利用するサーフェイスを指定する
try {
myRecorder.prepare(); // 録画準備
} catch (Exception e) {
Log.e("recMovie", e.getMessage());
}
}
// タッチパネルが押されたら録画開始/録画停止
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 録画中でなければ録画を開始
if (!isRecording) {
initializeVideoSettings(); // MediaRecorderの設定
myRecorder.start(); // 録画開始
isRecording = true; // 録画中のフラグを立てる
// 録画中であれば録画を停止
} else {
myRecorder.stop(); // 録画停止
myRecorder.reset(); // オブジェクトをリセット
isRecording = false; // 録画中のフラグを外す
}
}
return true;
}
ここではMediaRecorderの一連の初期設定を1つの関数としてまとめています。
タッチパネルを押すことで録画の開始と停止を行うようにしています。
また、録画にはカメラとSDカードを使用していますので、マニフェストファイルに
パーミッションの設定が必要です。
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(http://techbooster.googlecode.com/svn/trunk/recMovie/AndroidManifest.xml)
ビデオエンコーダ
setVideoEncoderメソッドで指定できるエンコーダには
サンプルで指定したMPEG_4_SP以外にも以下のようなものがあります。
| DEFAULT | システムデフォルト |
| H263 | H263エンコーダ |
| H264 | H264エンコーダ |
| MPEG_4_SP | MPEG4 SPエンコーダ |
入力ソース
setVideoSourceメソッドで指定できる入力ソースは現状、カメラだけのようです。
| DEFAULT | システムデフォルト |
| CAMERA | カメラ |
ファイルフォーマット
setOutputFormatで指定することができるファイルフォーマットにもいくつか選択肢があります。
| THREE_GPP | 3GPPファイルフォーマット |
| RAW_AMR | AMR NBファイルフォーマット |
| MPEG_4 | MPEG4ファイルフォーマット |
| DEFAULT | システムデフォルト |
| AMR_WB | AMR WBファイルフォーマット |
| AMR_NB | AMR NBファイルフォーマット |