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, {})
相容性和限制
高速錄影功能需要特定 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 開發人員討論群組或提交錯誤報告:
繼續閱讀
-
產品新訊
盡可能確保 Google Play 提供最安全可靠的服務體驗。今天,我們宣布推出一系列新政策和帳戶轉移功能,進一步保障使用者隱私,並防範詐欺行為。
Bennet Manuel • 3 分鐘可讀完
-
產品新訊
現在使用 Android Emulator,就能輕鬆測試支援多種裝置的互動。
Steven Jenkins • 閱讀時間:2 分鐘
-
產品新訊
每位開發人員的 AI 工作流程和需求都不盡相同,因此選擇 AI 輔助開發的方式非常重要。我們在 1 月推出這項功能,讓您選擇任何本機或遠端 AI 模型,為 Android Studio 中的 AI 功能提供支援
Matthew Warner • 閱讀時間:2 分鐘
隨時掌握最新消息
每週透過電子郵件接收最新的 Android 開發洞察資料。