Android の Camera2 API を使って 動画を撮影する


Android の Camera2 API を使って カメラのプレビュー画面を表示する
の続きです。

概要

下記の公式サンプルが公開されている。
これを例に説明する。

Android Camera2Video Sample

カメラからの画像の出力先として、
写真(静止画)の場合は、ImageReaderを使用した。
動画の場合は、MediaRecorderを使用する。

MediaRecorder

オーディオおよびビデオのキャプチャおよびエンコードをするためのクラス。

reference : MediaRecorder

使い方は、下記の記事を参考に。
注意: パラメータの設定には、順番がある。
違反すると、IllegalStateException が発生する。

MEDIARECORDERで録画する

下記のように 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