CameraX チームは、バージョン 1.5 のリリースを発表できることを嬉しく思っています。今回の最新アップデートでは、プロレベルの機能を簡単に利用できるようにするとともに、カメラ セッションをこれまで以上に簡単に構成できるようにすることに重点を置いています。
動画撮影では、スローモーション動画や高フレームレート動画を簡単に撮影できるようになりました。さらに、新しい Feature Group API を使用すると、10 ビット HDR と 60 FPS などの複雑な組み合わせを安心して有効にできるため、サポートされているデバイスで一貫した結果が得られます。
画像キャプチャ では、未処理の非圧縮 DNG(RAW)ファイルのキャプチャをサポートすることで、最大限の柔軟性を実現しています。また、強力な Camera Extensions を使用する場合でも、ウルトラ HDR 出力を活用できるようになりました。
これらの機能を支えているのは、カメラの設定と再構成を効率化する新しい SessionConfig API です。それでは、これらのエキサイティングな新機能の詳細を見ていきましょう。
強力な動画撮影: 高速撮影と機能の組み合わせ
CameraX 1.5 では動画機能が大幅に拡張され、よりクリエイティブで堅牢な撮影が可能になりました。
スローモーション動画と高フレームレート動画
待望のスローモーション動画機能が利用できるようになりました。高速動画(120 fps や 240 fps など)を撮影し、ドラマチックなスローモーション動画に直接エンコードできます。また、同じ高フレームレートで撮影して、非常にスムーズな動画を作成することもできます。
VideoCapture API に慣れている方であれば、簡単に実装できます。
1. 高速撮影のサポートを確認する: 新しい Recorder.getHighSpeedVideoCapabilities() メソッドを使用して、デバイスがこの機能をサポートしているかどうかをクエリします。
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val highSpeedCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)
if (highSpeedCapabilities == null) {
// This camera device does not support high-speed video.
return
}**2. ユースケースを構成してバインドする: 返された videoCapabilities(サポートされている動画品質情報を含む)を使用して、HighSpeedVideoSessionConfig を作成します。次に、cameraInfo.getSupportedFrameRateRanges() を使用して、サポートされているフレームレート範囲をクエリし、目的の範囲を設定する必要があります。スローモーション動画を撮影するには、setSlowMotionEnabled(true) を呼び出します。呼び出さない場合は、高フレームレート動画が撮影されます。最後の手順として、通常の Recorder.prepareRecording().start() を使用して動画の撮影を開始します。
val preview = Preview.Builder().build()
val quality = highSpeedCapabilities
.getSupportedQualities(DynamicRange.SDR).first()
val recorder = Recorder.Builder()
.setQualitySelector(QualitySelector.from(quality)))
.build()
val videoCapture = VideoCapture.withOutput(recorder)
val frameRateRange = cameraInfo.getSupportedFrameRateRanges(
HighSpeedVideoSessionConfig(videoCapture, preview)
).first()
val sessionConfig = HighSpeedVideoSessionConfig(
videoCapture,
preview,
frameRateRange = frameRateRange,
// Set true for slow-motion playback, or false for high-frame-rate
isSlowMotionEnabled = true
)
cameraProvider.bindToLifecycle(
lifecycleOwner, cameraSelector, sessionConfig)
// Start recording slow motion videos.
val recording = recorder.prepareRecording(context, outputOption)
.start(executor, {})互換性と制限事項
高速撮影には、特定の CameraConstrainedHighSpeedCaptureSession と CamcorderProfile のサポートが必要です。常に機能チェックを行い、サポートされているデバイスでのみ高速撮影を有効にして、ユーザー エクスペリエンスの低下を防ぎます。現在、この機能はほぼすべての Google Pixel デバイスの背面カメラと、他のメーカーの一部のモデルでサポートされています。
詳しくは、こちらのブログ投稿をご覧ください。
Feature Group API で機能を安心して組み合わせる
CameraX 1.5 では、機能の互換性を推測する必要がない Feature Group API が導入されました。Android 15 の機能の組み合わせクエリ API に基づいて、複数の機能を同時に有効にできるため、安定したカメラ セッションが保証されます。Feature Group は現在、HDR(HLG)、60 fps、プレビューの手ぶれ補正、ウルトラ HDR をサポートしています。たとえば、Google Pixel 10 と Galaxy S25 シリーズでは、HDR、60 fps、プレビューの手ぶれ補正を同時に有効にできます。今後の機能強化では、4K 撮影と超広角ズームが追加される予定です。
Feature Group API では、次の 2 つの重要なユースケースが可能です。
ユースケース 1: 最高品質を優先する
可能な限り最高の機能の組み合わせで撮影する場合は、優先順位付きのリストを指定できます。CameraX は、デバイスが完全にサポートしている最初の組み合わせを選択し、順番に有効にしようとします。
val sessionConfig = SessionConfig(
useCases = listOf(preview, videoCapture),
preferredFeatureGroup = listOf(
GroupableFeature.HDR_HLG10,
GroupableFeature.FPS_60,
GroupableFeature.PREVIEW_STABILIZATION
)
).apply {
// (Optional) Get a callback with the enabled features to update your UI.
setFeatureSelectionListener { selectedFeatures ->
updateUiIndicators(selectedFeatures)
}
}
processCameraProvider.bindToLifecycle(activity, cameraSelector, sessionConfig)この例では、CameraX は次の順序で機能を有効にしようとします。
- HDR + 60 FPS + プレビューの手ぶれ補正
- HDR + 60 FPS
- HDR + プレビューの手ぶれ補正
- HDR
- 60 FPS + プレビューの手ぶれ補正
- 60 FPS
- プレビューの手ぶれ補正
- なし
ユースケース 2: ユーザー向けの設定 UI を構築する
アプリの設定 UI で、サポートされている機能の組み合わせを正確に反映できるようになりました。下の図のように、サポートされていないオプションの切り替えを無効にできます。
切り替えをグレー表示するかどうかを判断するには、次のコードを使用して機能の組み合わせのサポートを確認します。まず、個々の機能のステータスをクエリします。機能が有効になったら、有効にした機能を使用して残りの機能を再度クエリし、互換性の制約により切り替えをグレー表示する必要があるかどうかを確認します。
fun disableFeatureIfNotSuported(
enabledFeatures: Set<GroupableFeature>,
featureToCheck:GroupableFeature
) {
val sessionConfig = SessionConfig(
useCases = useCases,
requiredFeatureGroup = enabledFeatures + featureToCheck
)
val isSupported = cameraInfo.isFeatureGroupSupported(sessionConfig)
if (!isSupported) {
// disable the toggle for featureToCheck
}
}詳しくは、Feature Group のブログ投稿 をご覧ください。
その他の動画拡張機能
- 同時カメラの改善: CameraX 1.5.1 では、非合成モード で、各 SingleCameraConfig に対してプレビュー、ImageCapture、VideoCapture のユースケースを同時にバインドできるようになりました。また、合成モード (CompositionSettings を使用した同じユースケース)では、最終的な合成結果に適用される
CameraEffectを設定できるようになりました。 - 動的なミュート:
PendingRecording.withAudioEnabled(boolean initialMuted)を使用してミュート状態で録画を開始し、Recording.mute(boolean muted)を使用して後でミュートを解除できるようにしました。 - ストレージ不足の処理の改善: CameraX は
VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGEエラーを確実にディスパッチするようになったため、アプリはストレージ不足の状況を適切に処理してユーザーに通知できます。 - 低照度ブースト: サポートされているデバイス(Google Pixel 10 シリーズなど)では、CameraControl.enableLowLightBoostAsync を有効にすると、暗い環境でプレビューと動画ストリームが自動的に明るくなります。
プロレベルの画像キャプチャ
CameraX 1.5 では、最大限の品質と柔軟性を求めるデベロッパー向けに、ImageCapture が大幅にアップグレードされました。
DNG(RAW)キャプチャでクリエイティブなコントロールを実現
後処理を完全に制御するために、CameraX は DNG(RAW)キャプチャをサポートするようになりました。これにより、カメラセンサーから未処理の非圧縮画像データに直接アクセスできるため、プロレベルの編集と色調補正が可能になります。この API では、DNG ファイルのみをキャプチャすることも、JPEG と DNG の出力を同時にキャプチャすることもできます。JPEG ファイルと DNG ファイルを同時にキャプチャする方法については、以下のサンプルコードをご覧ください。
val capabilities = ImageCapture.getImageCaptureCapabilities(cameraInfo)
val imageCapture = ImageCapture.Builder().apply {
if (capabilities.supportedOutputFormats
.contains(OUTPUT_FORMAT_RAW_JPEG)) {
// Capture both RAW and JPEG formats.
setOutputFormat(OUTPUT_FORMAT_RAW_JPEG)
}
}.build()
// ... bind imageCapture to lifecycle ...
// Provide separate output options for each format.
val outputOptionRaw = /* ... configure for image/x-adobe-dng ... */
val outputOptionJpeg = /* ... configure for image/jpeg ... */
imageCapture.takePicture(
outputOptionRaw,
outputOptionJpeg,
executor,
object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(results: OutputFileResults) {
// This callback is invoked twice: once for the RAW file
// and once for the JPEG file.
}
override fun onError(exception: ImageCaptureException) {}
}
)Camera Extensions のウルトラ HDR
Camera Extensions(夜景モードなど)の優れた計算写真学と、ウルトラ HDR の鮮やかな色とダイナミック レンジを両立させることができます。この機能は、Google Pixel 9/10 シリーズや Samsung S24/S25 シリーズなど、最近の多くのハイエンド Android スマートフォンでサポートされています。
// Support UltraHDR when Extension is enabled.
val extensionsEnabledCameraSelector = extensionsManager
.getExtensionEnabledCameraSelector(
CameraSelector.DEFAULT_BACK_CAMERA, ExtensionMode.NIGHT)
val imageCapabilities = ImageCapture.getImageCaptureCapabilities(
cameraProvider.getCameraInfo(extensionsEnabledCameraSelector)
val imageCapture = ImageCapture.Builder()
.apply {
if (imageCapabilities.supportedOutputFormats
.contains(OUTPUT_FORMAT_JPEG_ULTRA_HDR) {
setOutputFormat(OUTPUT_FORMAT_JPEG_ULTRA_HDR)
}
}.build()コア API とユーザビリティの強化
新しい構成方法: SessionConfig
上記の例でわかるように、SessionConfig は CameraX 1.5 の新しいコンセプトです。構成を一元化し、次の 2 つの重要な方法で API を簡素化します。
- 手動での
unbind()呼び出しが不要: CameraX API はライフサイクルを認識します。アクティビティまたは他のLifecycleOwnerが破棄されると、ユースケースは暗黙的に「バインド解除」されます。ただし、ユースケースの更新やカメラの切り替えを行う場合は、再バインドする前にunbind()またはunbindAll()を呼び出す必要があります。CameraX 1.5 では、新しいSessionConfigをバインドすると、CameraX がセッションをシームレスに更新するため、unbind 呼び出しは不要になります。 - 決定論的なフレームレート制御: 新しい
SessionConfigAPI では、フレームレートを決定論的に管理できます。以前のsetTargetFrameRateはヒントにすぎませんでしたが、この新しいメソッドでは、構成が成功すると指定したフレームレート範囲が確実に 適用されます。精度を確保するには、CameraInfo.getSupportedFrameRateRanges(SessionConfig)を使用して、サポートされているフレームレートをクエリする必要があります。完全なSessionConfigを渡すことで、CameraX はストリーム構成に基づいてサポートされている範囲を正確に判断できます。
Camera-Compose が安定版になりました
Jetpack Compose をご愛用いただきありがとうございます。camera-compose ライブラリがバージョン 1.5.1 で安定版になったことをお知らせいたします。このリリースには、CameraXViewfinder を moveableContentOf や Pager などの Compose 機能で使用する場合に関連する重要なバグの修正と、プレビューの引き伸ばし問題の解決が含まれています。今後のリリースでは、camera-compose にさらに多くの機能を追加していく予定です。
ImageAnalysis と CameraControl の改善
- トーチの強度の調整: 新しい API を使用して、デバイスのトーチを細かく制御できます。CameraInfo.getMaxTorchStrengthLevel() を使用してサポートされている最大強度をクエリし、CameraControl.setTorchStrengthLevel() で目的のレベルを設定できます。
ImageAnalysisでの NV21 のサポート:ImageAnalysisから NV21 画像形式を直接リクエストできるようになり、他のライブラリや API との統合が簡素化されました。これは、ImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21)を呼び出すことで有効になります。
今すぐ始めましょう
依存関係を CameraX 1.5 に更新 して、エキサイティングな新機能を試してみてください。皆様が構築されるマップ エクスペリエンスを楽しみにしております。
CameraX 1.5 を使用するには、libs.versions.toml に次の依存関係を追加してください。(多くの重要なバグの修正と同時カメラの改善が含まれている 1.5.1 を使用することをおすすめします)。
[versions]
camerax = "1.5.1"
[libraries]
..
androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" }
androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" }
androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" }
androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }
androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camerax" }
androidx-camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "camerax" }次に、これらをモジュールの build.gradle.kts の依存関係に追加します。
dependencies {
..
implementation(libs.androidx.camera.core)
implementation(libs.androidx.camera.lifecycle)
implementation(libs.androidx.camera.camera2)
implementation(libs.androidx.camera.view) // for PreviewView
implementation(libs.androidx.camera.compose) // for compose UI
implementation(libs.androidx.camera.extensions) // For Extensions
}ご不明な点がある場合や、CameraX チームにご連絡が必要な場合は、CameraX デベロッパー ディスカッション グループに参加するか、バグを報告してください。
-
プロダクト ニュースGoogle Play では、安全なオンライン エクスペリエンスを提供し、ユーザーを危害から保護することを最優先に考えています。
Paul Feng • 所要時間: 2 分 -
2026 年 7 月 28 日2026 年 7 月 28 日
プロダクト ニュース本日、Jetpack Compose 1.0 のリリースから 5 年を迎えました。2021 年 7 月 28 日に発表されたバージョン 1.0 から最新の 1.11 リリースまで、API は長年にわたって大幅に進化してきました。この節目を祝いたいと思います。
Rebecca Franks, Nick Butcher, Loryn Hairston • 所要時間: 5 分 -
プロダクト ニュースAndroid Studio Quail 2 が安定版になり、本番環境で使用できるようになりました。同時エージェント ワークフロー、ネイティブに統合されたメモリリーク プロファイリング、コンテキスト認識型のクラッシュ修復により、IDE が変わります。
Amman Asfaw • 所要時間: 3 分
Android 開発に関する最新の分析情報を毎週メールでお届けします。