🎥

【Android】CameraXを使用し動画を撮影する

2024/04/19に公開

AndroidでCameraXを使用した動画撮影の完全ガイド

Androidの開発において、カメラ機能は多くのアプリケーションで不可欠な部分です。CameraXは、Android Jetpackの一部として提供されるカメラAPIのラッパーであり、開発者が容易にカメラ機能をアプリケーションに統合できるように設計されています。この記事では、CameraXを使用して写真を撮影する基本的なプロセスを説明します。

CameraXの基本

CameraXは、複数のAndroidデバイスにわたるカメラ操作の簡素化と統一を目指したライブラリです。プレビュー、写真撮影、ビデオ録画など、カメラに関連する一般的な機能を容易に実装できるようにします。

https://developer.android.com/media/camera/camerax?hl=ja

動画撮影の実装

動画撮影機能の実装は以下のステップに分けられます:

  1. パーミッションの設定: アプリがカメラとマイク、ストレージへのアクセス権を持っていることを確認します。
  2. カメラの起動: カメラのプレビューをセットアップし、使用可能なカメラを選択してバインドします。
  3. 動画撮影のトリガー: ユーザーの操作に応じて動画の録画を開始または停止します。
private fun captureVideo() {
    val videoCapture = this.videoCapture ?: return

    // 既に録画中の場合は停止
    recording?.stop()
    recording = null

    // 新しい録画セッションの設定
    val outputOptions = setupRecordingSession()
    recording = videoCapture.output.prepareRecording(this, outputOptions).start(ContextCompat.getMainExecutor(this)) { recordEvent ->
        handleVideoCaptureEvent(recordEvent)
    }
}

private fun setupRecordingSession(): MediaStoreOutputOptions {
    val name = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS", Locale.US).format(System.currentTimeMillis())
    val contentValues = ContentValues().apply {
        put(MediaStore.MediaColumns.DISPLAY_NAME, name)
        put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
        put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/CameraX-Video")
    }

    return MediaStoreOutputOptions.Builder(contentResolver, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
        .setContentValues(contentValues)
        .build()
}

private fun handleVideoCaptureEvent(recordEvent: VideoRecordEvent) {
    when (recordEvent) {
        is VideoRecordEvent.Start -> findViewById<Button>(R.id.videoCaptureButton).text = "Stop Recording"
        is VideoRecordEvent.Finalize -> {
            if (recordEvent.hasError()) {
                Log.e(TAG, "Video capture ends with error: ${recordEvent.error}")
            } else {
                Toast.makeText(this, "Video capture succeeded: ${recordEvent.outputResults.outputUri}", Toast.LENGTH_SHORT).show()
            }
            findViewById<Button>(R.id.videoCaptureButton).text = "Start Recording"
        }
    }
}

Discussion