Android の Camera2 API を使って カメラのプレビュー画面を表示する
の続きです。
概要
下記の公式サンプルが公開されている。
これを例に説明する。
カメラからの画像の出力先として、
写真(静止画)の場合は、ImageReaderを使用した。
動画の場合は、MediaRecorderを使用する。
MediaRecorder
オーディオおよびビデオのキャプチャおよびエンコードをするためのクラス。
使い方は、下記の記事を参考に。
注意: パラメータの設定には、順番がある。
違反すると、IllegalStateException が発生する。
下記のように MediaRecorder を生成する。
Size videoSize;
String outputFile;
int orientation;
MediaRecorder mediaRecorder = new MediaRecorder();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(outputFile);
mediaRecorder.setVideoEncodingBitRate(10000000);
mediaRecorder.setVideoFrameRate(30);
mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight());
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setOrientationHint(orientation);
mediaRecorder.prepare();
録画の開始
Recordボタンをクリックすると、
MediaRecorderを出力先にして、キャプチャーを要求する。
previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
List<Surface> surfaces = new ArrayList<>();
surfaces.add(previewSurface);
previewBuilder.addTarget(previewSurface);
Surface recorderSurface = mediaRecorder.getSurface();
surfaces.add(recorderSurface);
previewBuilder.addTarget(recorderSurface);
cameraDevice.createCaptureSession(surfaces, cameraCaptureSession.StateCallback, backgroundHandler);
キャプチャーを開始すると、
CameraCaptureSession.StateCallback の中で onConfigured が呼ばれる。
それを契機に、録画を開始する。
CameraCaptureSession.StateCallback() {
@Override
public void onConfigured( CameraCaptureSession cameraCaptureSession) {
mediaRecorder.start();
録画の終了
Record ボタンをクリックすると、MediaRecorder を停止し、リソースを開放する。
mediaRecorder.stop();
mediaRecorder.reset();
MediaRecorder の出力フォーマット
公式サンプルでは MPEG4 にしている。
下記のように10種類ほどある。
MediaRecorder.OutputFormat.xxx
Value | Name | Remarks |
---|---|---|
0 | DEFAULT | |
1 | THREE_GPP | |
2 | MPEG_4 | |
3 | AMR_NB | |
4 | AMR_WB | |
5 | AAC_ADIF | |
6 | AAC_ADTS | |
7 | RTP_AVP | |
8 | MPEG_2_TS | Added in API level 26 |
9 | WEBM | |
11 | OGG | Added in API level 29 |
reference : MediaRecorder.OutputFormat
MPEG4 は、現在の主流でありこのまま何の支障もない。
しかし選択肢があると試したくなる。
PreferenceFragment を使って選択できるようにする。
サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Camera213