CameraX 團隊很高興宣布推出 1.5 版!這次更新的重點是提供專業級功能,讓您輕鬆設定攝影機工作階段。
影片錄製:使用者現在可以輕鬆拍攝精彩的慢動作或高格率影片。更重要的是,新的功能群組 API 可讓您放心地啟用複雜的組合,例如10 位元 HDR 和 60 FPS,確保支援的裝置都能提供一致的結果。
在影像擷取方面,Pixel 8 Pro 支援擷取未經處理的未壓縮 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 裝置的後置鏡頭都支援這項功能,其他製造商的特定機型也支援。
詳情請參閱這篇網誌文章。
結合特徵與信賴度:特徵群組 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 會依下列順序嘗試啟用功能:
- HDR + 60 FPS + 預覽防震功能
- HDR + 60 FPS
- HDR + 預覽防震功能
- 高動態範圍
- 60 FPS + 預覽防震功能
- 每秒 60 個影格
- 預覽防震功能
- 無
用途 2:建構面向使用者的設定 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
}
}詳情請參閱功能群組網誌文章 。
更多影片強化功能
- 並行使用相機的改善項目:使用 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:
- 不必再手動呼叫
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 穩定版!這個版本修正了與 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 開發人員討論群組或提交錯誤報告:
繼續閱讀
-
產品新訊
我們希望您能更快速輕鬆地建構優質 Android 應用程式,而協助您提升工作效率的其中一個方法,就是讓您隨時都能運用 AI。
Matthew McCullough • 閱讀時間:2 分鐘
-
產品新訊
Android 獨有的彈性和開放性,向來是推動產業創新的動力。
Sameer Samat • 3 分鐘可讀完
-
產品新訊
Android Studio Panda 2 現已推出穩定版,可用於正式工作環境。
Matt Dyor • 3 分鐘可讀完
隨時掌握最新消息
每週透過電子郵件接收最新的 Android 開發洞察資訊。