CameraX 团队很高兴地宣布推出 1.5 版!此次最新更新的重点是让您轻松使用专业级功能,同时让相机会话的配置比以往更加简单。
对于视频录制,用户现在可以轻松拍摄出色的慢动作或高帧速率视频。更重要的是,借助新的 Feature Group API,您可以放心地启用复杂的组合(例如 10 位 HDR 和 60 FPS),确保在受支持的设备上获得一致的结果。
在图片拍摄 方面,您可以灵活地拍摄未经处理、未经压缩的 DNG (RAW) 文件。此外,即使使用强大的 Camera Extensions,您现在也可以利用 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,放心地同时启用多个功能,保证相机会话的稳定性。Feature Group 目前支持:HDR (HLG)、60 fps、预览防抖和 Ultra HDR 。例如,您可以在 Pixel 10 和 Galaxy S25 系列上同时启用 HDR、60 fps 和预览防抖。我们计划在未来的增强功能中加入 4K 录制和超广角变焦。
Feature Group 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 + 预览防抖
- HDR
- 60 FPS + 预览防抖
- 60 FPS
- 预览防抖
- 无
用例 2:构建面向用户的设置界面
您现在可以在应用的设置界面中准确反映支持哪些功能组合,并为不支持的选项(如下面的图片所示)停用切换开关。
如需确定是否将切换开关灰显,请使用以下代码检查功能组合支持情况。首先,查询每个单独功能的状态。启用某个功能后,使用已启用的功能重新查询其余功能,以查看是否必须因兼容性限制而将它们的切换开关灰显。
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 并发绑定 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) {}
}
)
Camera Extensions 的 Ultra HDR
兼具两者的优点:Camera Extensions(例如夜间模式)的出色计算摄影功能,以及 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:
-
不再需要手动调用
unbind(): CameraX API 具有生命周期感知能力。当 activity 或其他LifecycleOwner被销毁时,它会隐式“取消绑定”您的用例。但是,更新用例或切换相机仍需要您在重新绑定之前调用unbind()或unbindAll()。现在,借助 CameraX 1.5,当您绑定新的SessionConfig时,CameraX 会为您无缝更新会话,无需调用取消绑定。 -
确定性帧速率控制: 新的
SessionConfigAPI 引入了一种确定性方式来管理帧速率。与之前的setTargetFrameRate(仅为提示)不同,此新方法保证 在成功配置后应用指定的帧速率范围。为确保准确性,您必须使用CameraInfo.getSupportedFrameRateRanges(SessionConfig)查询受支持的帧速率。通过传递完整的SessionConfig,CameraX 可以根据流配置准确确定受支持的范围。
Camera-Compose 现已稳定
我们知道您非常喜欢 Jetpack Compose,因此很高兴地宣布,camera-compose 库现已稳定,版本为 1.5.1!此版本包含与使用 Compose 功能(例如 moveableContentOf 和 Pager)相关的 CameraXViewfinder 的重要 bug 修复,并解决了预览拉伸问题。我们将在未来的版本中继续向 camera-compose 添加更多功能。
ImageAnalysis 和 CameraControl 改进
- 手电筒强度调整: 使用新的 API 对设备的手电筒进行精细控制。您可以使用 CameraInfo.getMaxTorchStrengthLevel() 查询支持的最大强度,然后使用 CameraControl.setTorchStrengthLevel() 设置所需的级别。
-
NV21 支持
ImageAnalysis: 您现在可以直接从ImageAnalysis请求 NV21 图片格式,从而简化与其他库和 API 的集成。通过调用ImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21)即可启用此功能。
立即开始使用
立即将依赖项更新到 CameraX 1.5 ,探索令人兴奋的新功能。我们迫不及待地想看看您会构建出什么。
如需使用 CameraX 1.5,请将以下依赖项添加到 libs.versions.toml。(我们建议使用 1.5.1,其中包含许多重要的 bug 修复和并发相机改进。)
[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 开发者讨论组或提交 bug 报告:
继续阅读
-
产品资讯
Android Studio Panda 4 现已稳定,可在生产环境中使用。此版本引入了规划模式、“下一项编辑预测”等功能,让您比以往更轻松地构建高质量的 Android 应用。
Matt Dyor • 5 分钟阅读时间
-
产品资讯
如果您是 Android 开发者,希望在应用中实现创新的 AI 功能,那么您一定会对我们最近推出的强大新更新感兴趣。
Thomas Ezan • 3 分钟阅读时间
-
产品资讯
Android 17 已发布 Beta 4 版,这是此发布周期中计划的最后一个 Beta 版,是应用兼容性和平台稳定性的重要里程碑。
Daniel Galpin • 4 分钟阅读时间
随时了解最新动态
每周都会将最新的 Android 开发洞见发送到您的收件箱 每周。