產品新訊

隆重推出 CameraX 1.5:強大的錄影功能和專業級影像擷取功能

閱讀時間:7 分鐘
Scott Nien
軟體工程師

CameraX 團隊很高興宣布推出 1.5 版!這次的最新更新著重於提供專業級功能,讓您輕鬆設定攝影機工作階段。

影片錄製:使用者現在可以輕鬆拍攝精彩的慢動作或高格率影片。更重要的是,新的功能群組 API 可讓您放心地啟用複雜的組合,例如10 位元 HDR 和 60 FPS,確保支援的裝置都能提供一致的結果。

影像擷取方面,您可擷取未經處理的未壓縮 DNG (RAW) 檔案,享有最大彈性。此外,現在即使使用強大的相機擴充功能,也能運用 Ultra HDR 輸出功能。

這些功能以全新的 SessionConfig API 為基礎,可簡化相機設定和重新設定程序。現在,讓我們深入瞭解這些令人期待的新功能。

強大的影片錄製功能:高速錄影和功能組合

CameraX 1.5 大幅擴充了影片功能,可提供更具創意且穩定的錄製體驗。

慢動作和高影格速率影片

我們最受期待的功能之一「慢動作影片」現已推出。現在你可以拍攝高速影片 (例如 120 或 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, {})

相容性和限制

高速錄影功能需要特定 CameraConstrainedHighSpeedCaptureSessionCamcorderProfile 支援。請務必執行功能檢查,並只在支援的裝置上啟用高速錄影功能,以免使用者體驗不佳。目前幾乎所有 Pixel 裝置的後置鏡頭都支援這項功能,其他製造商的特定機型也支援。

詳情請參閱這篇網誌文章

結合特徵與信賴度:特徵群組 API

CameraX 1.5 推出功能群組 API,可消除功能相容性的猜測。現在您可以根據 Android 15 的功能組合查詢 API,同時啟用多項功能,確保相機工作階段穩定運作。目前支援的功能包括:HDR (HLG)、60 fps、預覽穩定和 Ultra HDR。舉例來說,你可以在 Pixel 10 和 Galaxy S25 系列上同時啟用 HDR、60 FPS 和預覽穩定功能。我們預計日後會推出更多強化功能,包括 4K 錄影和超廣角變焦。

功能群組 API 可支援兩種重要用途:

用途 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 會依下列順序嘗試啟用功能:

  1. HDR + 60 FPS + 預覽防震功能
  2. HDR + 60 FPS
  3. HDR + 預覽防震功能
  4. 高動態範圍
  5. 60 FPS + 預覽防震功能
  6. 每秒 60 個影格
  7. 預覽防震功能

用途 2:建構面向使用者的設定 UI

現在,您可以在應用程式的設定使用者介面中,準確反映支援的功能組合,並停用不支援選項的切換鈕,如下圖所示。

unsupported-features-disabled.gif

如要判斷是否要將切換鈕設為灰色,請使用下列程式碼檢查功能組合支援。一開始,請查詢每項功能的狀態。啟用功能後,請重新查詢其餘功能,看看是否因相容性限制而必須停用。

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
 }
}

詳情請參閱功能群組網誌文章

更多影片強化功能

  • 並行使用相機的改善項目:使用 CameraX 1.5.1 時,您現在可以為非組合模式中的每個 SingleCameraConfig,同時繫結 Preview + ImageCapture + VideoCapture 用途。此外,在組合模式 (與 CompositionSettings 相同的使用案例) 中,您現在可以設定套用至最終組合結果的 CameraEffect
  • 動態靜音:您現在可以使用 PendingRecording.withAudioEnabled(boolean initialMuted) 以靜音狀態開始錄製,並允許使用者稍後使用 Recording.mute(boolean muted) 取消靜音。
  • 改善儲存空間不足的處理方式:CameraX 現在會可靠地傳送 VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE 錯誤,讓應用程式能妥善處理儲存空間不足的情況,並通知使用者。
  • 低光源強化:在支援的裝置 (例如 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) {}
    }
)

相機擴充功能的 Ultra HDR

結合 Camera Extensions 的出色計算攝影技術 (例如夜間模式),以及 Ultra HDR 的鮮明色彩和動態範圍,拍出最完美的相片。這項功能目前支援許多近期的頂級 Android 手機,例如 Pixel 9/10 系列和 Samsung S24/25 系列。

// 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:

  1. 不必再手動呼叫 unbind()CameraX API 可感知生命週期,活動或其他 LifecycleOwner 遭到刪除時,系統會隱含地「解除繫結」用途。不過,更新用途或切換相機時,您仍須先呼叫 unbind()unbindAll(),才能重新繫結。現在使用 CameraX 1.5 時,繫結新的 SessionConfig 後,CameraX 會自動更新工作階段,不必再呼叫取消繫結。
  2. 確定性影格速率控制:新的 SessionConfig API 推出確定性影格速率管理方式。與先前的 setTargetFrameRate (僅為提示) 不同,這個新方法保證在設定成功後,會套用指定的影格率範圍。為確保準確度,您必須使用 CameraInfo.getSupportedFrameRateRanges(SessionConfig) 查詢支援的影格速率。傳遞完整的 SessionConfig 後,CameraX 就能根據串流設定準確判斷支援的範圍。

Camera-Compose 現已推出穩定版

我們知道您非常喜歡 Jetpack Compose,因此很高興宣布 camera-compose 程式庫現已推出 1.5.1 穩定版!這個版本修正了與 CameraXViewfinder 相關的重大錯誤,包括使用 moveableContentOfPager 等 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 開發人員討論群組或提交錯誤報告:

撰寫者:

繼續閱讀