CameraX チームは、バージョン 1.5 のリリースを発表できることを嬉しく思います。今回の最新のアップデートでは、プロフェッショナル グレードの機能を簡単に利用できるようにするとともに、カメラ セッションをこれまで以上に簡単に設定できるようにすることに重点を置いています。
動画撮影では、スローモーションや高フレームレートの動画を簡単に撮影できるようになりました。さらに重要なのは、新しい Feature Group API を使用すると、10 ビット HDR と 60 FPS などの複雑な組み合わせを確実に有効にできることです。これにより、サポートされているデバイス間で一貫した結果が得られます。
画像キャプチャの面では、未処理の非圧縮 DNG(RAW)ファイルのキャプチャをサポートすることで、最大限の柔軟性を実現しています。また、強力なカメラ拡張機能を使用している場合でも、ウルトラ 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 シリーズと Samsung Galaxy S25 シリーズでは、HDR、60 fps、プレビューの安定化を同時に有効にできます。今後の機能強化では、4K 録画や超広角ズームなどが予定されています。
特徴グループ 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エラーを確実にディスパッチするようになり、アプリでストレージ不足の状況を適切に処理してユーザーに通知できるようになりました。 - Low Light Boost: サポートされているデバイス(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) {} } )
カメラ拡張機能のウルトラ HDR
カメラ拡張機能(夜景モードなど)の優れたコンピュテーショナル フォトグラフィーと、ウルトラ 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 の新しいコンセプトです。構成を一元化し、API を次の 2 つの方法で簡素化します。
- 手動による
unbind()呼び出しが不要に: CameraX API はライフサイクルを認識します。アクティビティや他のLifecycleOwnerが破棄されると、ユースケースは暗黙的に「バインド解除」されます。ただし、ユースケースの更新やカメラの切り替えを行う場合は、再バインドの前にunbind()またはunbindAll()を呼び出す必要があります。CameraX 1.5 では、新しいSessionConfigをバインドすると、CameraX がセッションをシームレスに更新するため、バインド解除の呼び出しは不要になります。 - 決定論的フレームレート制御: 新しい
SessionConfigAPI は、フレームレートを管理する決定論的な方法を導入します。以前のsetTargetFrameRateはヒントにすぎませんでしたが、この新しいメソッドでは、構成が成功した場合に指定されたフレームレート範囲が適用されることが保証されます。精度を確保するには、CameraInfo.getSupportedFrameRateRanges(SessionConfig)を使用してサポートされているフレームレートをクエリする必要があります。SessionConfig全体を渡すことで、CameraX はストリーム構成に基づいてサポートされている範囲を正確に判断できます。
Camera-Compose が安定版になりました
Jetpack Compose をお楽しみいただいている皆様にお知らせします。camera-compose ライブラリがバージョン 1.5.1 で安定版になりました。このリリースには、moveableContentOf や Pager などの Compose 機能での CameraXViewfinder の使用に関連する重大なバグの修正と、プレビューの引き伸ばしに関する問題の解決が含まれています。今後のリリースで 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 は、高品質の Android アプリをより迅速かつ簡単に構築できるようにしたいと考えています。生産性を高めるための方法の一つとして、AI を活用しています。
Matthew McCullough • 所要時間: 2 分
-
プロダクト ニュース
Android は、独自の柔軟性とオープン性を通じて、常に業界のイノベーションを推進してきました。
Sameer Samat • 所要時間: 3 分
-
プロダクト ニュース
Android Studio Panda 2 が安定版となり、本番環境で使用できる準備が整いました。
Matt Dyor • 所要時間: 3 分
メールを受け取る
Android 開発に関する最新の分析情報を毎週メールでお届けします。