0Pricing
Android Academy · レッスン

動画を録画する

CameraXで動画を撮影します。

「動画を録画する」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。

CameraXで動画を録画する

CameRXでは、Recorderを基盤とするVideoCaptureユースケースを通じて動画を録画します。このレッスンでは、動画撮影を設定し、録画を開始・停止して、音声を含む動画をギャラリーに保存する方法を学びます。

基本的な流れは写真の場合と似ていますが、開始した後で停止する、長時間実行のRecordingセッションが加わります。

Recorderと画質

まず、エンコード方式と画質を定義するRecorderを作成します。QualitySelectorを使うと、目標とする画質(HDやFHDなど)を指定し、デバイスが対応できない場合のフォールバックも設定できます。

val recorder = Recorder.Builder()
    .setQualitySelector(
        QualitySelector.from(
            Quality.FHD,
            FallbackStrategy.lowerQualityOrHigherThan(Quality.SD)
        )
    )
    .build()

VideoCaptureの作成

withOutputファクトリを使って、RecorderをVideoCaptureユースケースでラップします。これは、ImageCaptureと同じようにカメラへバインドするオブジェクトです。

val videoCapture = VideoCapture.withOutput(recorder)

プレビューとVideoCaptureのバインド

プレビューとVideoCaptureを一緒にバインドします。ただし、多くのデバイスではImageCaptureとVideoCaptureを同時にバインドできないため、画面に必要なユースケースを選択してください。

cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
    lifecycleOwner,
    CameraSelector.DEFAULT_BACK_CAMERA,
    preview,
    videoCapture
)

音声の権限

音声を録音するには、CAMERAに加えてRECORD_AUDIOの実行時権限が必要です。録画を開始する前に両方をリクエストし、ユーザーが許可した場合にのみ音声を有効にしてください。

// Manifest declares both:
// <uses-permission android:name="android.permission.CAMERA" />
// <uses-permission android:name="android.permission.RECORD_AUDIO" />

val audioGranted = ContextCompat.checkSelfPermission(
    context, Manifest.permission.RECORD_AUDIO
) == PackageManager.PERMISSION_GRANTED

MediaStoreによる出力

写真の場合と同じように、スコープ付きストレージを使って動画をMediaStoreに保存します。mp4のMIMEタイプを指定したContentValuesを作成し、MediaStoreOutputOptionsを作成します。

val values = ContentValues().apply {
    put(MediaStore.MediaColumns.DISPLAY_NAME, "VID_${System.currentTimeMillis()}")
    put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
    put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/MyApp")
}

val outputOptions = MediaStoreOutputOptions
    .Builder(context.contentResolver, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
    .setContentValues(values)
    .build()

録画の開始

レコーダーから録画を準備し、必要に応じてwithAudioEnabled()で音声を有効にしてから、start()を呼び出します。start()はRecordingオブジェクトを返すので、後で停止できるように保持しておきます。

また、VideoRecordEventの更新を受け取るリスナーも渡します。

val recording = videoCapture.output
    .prepareRecording(context, outputOptions)
    .apply { if (audioGranted) withAudioEnabled() }
    .start(ContextCompat.getMainExecutor(context)) { event ->
        when (event) {
            is VideoRecordEvent.Start -> { /* recording began */ }
            is VideoRecordEvent.Finalize -> {
                if (!event.hasError()) {
                    // event.outputResults.outputUri -> saved video
                }
            }
        }
    }

録画イベントへの対応

リスナーは録画のライフサイクルをストリームで通知します。

  • VideoRecordEvent.Start — 録画が開始されたことを示します(UIを停止ボタンに更新します)。
  • VideoRecordEvent.Status — 録画時間やサイズの定期的な更新を通知します。
  • VideoRecordEvent.Finalize — 録画が終了したことを示します。hasError()を確認してください。
is VideoRecordEvent.Status -> {
    val seconds = event.recordingStats.recordedDurationNanos / 1_000_000_000
    // Update an on-screen timer.
}

録画の停止

録画を終了するには、先ほど保存したRecordingに対してstop()を呼び出します。これによりFinalizeイベントが発生し、動画のURIを取得できるようになります。

アクティブな録画を状態として保持すると、1つのボタンで開始と停止を切り替えられます。

var activeRecording: Recording? = null

// Toggle handler:
if (activeRecording == null) {
    activeRecording = startRecording()
} else {
    activeRecording?.stop()
    activeRecording = null
}

一時停止と再開

Recordingは停止せずに一時停止・再開することもできます。ユーザーが複数のクリップを1つのファイルに編集できるようにする場合に便利です。

activeRecording?.pause()
// ...later
activeRecording?.resume()
// Final stop writes the file:
activeRecording?.stop()

録画用のCompose UI

状態に応じてUIを動かします。録画がアクティブかどうかを追跡し、それに応じてボタンのアイコンとアクションを切り替えます。リスナーはメインエグゼキュータ上で実行されるため、そこからComposeの状態を直接更新できます。

var isRecording by remember { mutableStateOf(false) }

IconButton(onClick = { toggleRecording() }) {
    Icon(
        imageVector = if (isRecording) Icons.Default.Stop else Icons.Default.Videocam,
        contentDescription = if (isRecording) "Stop" else "Record"
    )
}

確認テスト

CameraXによる動画録画を理解できているか確認しましょう。

まとめ

CameraXで動画を録画できるようになりました。

  • QualitySelectorを使ってRecorderを作成し、VideoCapture.withOutputでラップします。
  • プレビューとバインドし、音声用にRECORD_AUDIOをリクエストします。
  • MediaStoreOutputOptionsを使って保存し、prepareRecording().start()を呼び出してRecordingを取得します。
  • VideoRecordEventに対応し、stop()を呼び出して録画を確定し、保存されたURIを読み取ります。

CameraXのコースを修了しました。プレビュー、写真、動画の機能がすべて使えるようになりました。

よくある質問

「動画を録画する」レッスンは無料ですか?

はい。「動画を録画する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。

「動画を録画する」で何を学びますか?

CameraXで動画を撮影します。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「動画を録画する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CameraXの概要
  2. カメラプレビューを表示する
  3. 写真を撮影する
  4. 動画を録画する
← Android Academyに戻る