LoginSignup
7
9

More than 3 years have passed since last update.

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

Posted at

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 を使って選択できるようにする。
camera213_format.png

サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Camera213

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9