動画を録画する
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_GRANTEDMediaStoreによる出力
写真の場合と同じように、スコープ付きストレージを使って動画を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フィードバックを取得できます。ローカル設定は不要です。