產品最新消息

CameraX 1.5 隆重登場:強大的錄影功能和專業級圖片拍攝

閱讀時間:7 分鐘
查看 Scott Nien 的個人資料
Scott Nien 軟體工程師

CameraX 團隊很高興宣布推出 1.5 版!本次更新著重於提供專業級功能,同時簡化相機工作階段的設定流程。

錄影方面,使用者現在可以輕鬆錄製精彩的慢動作或高影格率影片。更重要的是,全新的 Feature Group 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, {})

相容性和限制

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

詳情請參閱網誌文章。

放心結合功能:Feature Group API

CameraX 1.5 推出 Feature Group 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. 預覽防震功能
  8. 無

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

現在,您可以在應用程式的設定 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

結合相機擴充功能的計算攝影技術 (例如夜間模式),以及 Ultra HDR 的鮮豔色彩和動態範圍,讓您兩全其美。這項功能目前支援許多近期推出的高階 Android 手機,例如 Pixel 9/10 系列和 Samsung S24/S25 系列。

// 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 時,自動更新工作階段,不必再呼叫解除繫結。
  2. 確定性影格速率控制:新的 SessionConfig API 導入確定性影格速率管理方式。舊版 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 開發人員討論群組,或提交錯誤報告:

繼續閱讀