使用CameraX 1.5进行高速拍摄和慢动作视频拍摄

作者:稀有猿诉日期:2025/11/5

本文译自「High-Speed Capture and Slow-Motion Video with CameraX 1.5」,原文链接android-developers.googleblog.com/2025/10/hig…,由Leo Huang发布于2025年10月28日。

清晰捕捉快速运动的画面是现代相机应用的关键特性。这可以通过高速拍摄来实现——即以 120 或 240 fps 等速率采集帧。这种高保真拍摄可用于两种截然不同的用途:创建高帧率视频以进行逐帧的详细分析,或生成慢动作视频,使动作在屏幕上呈现出戏剧性的展开效果。

以前,使用 Camera2 API 实现这些功能需要更多的人工操作。现在,CameraX 1.5 中新增的高速 API简化了整个流程,让你可以灵活地创建真正的高帧率视频或即用型慢动作短片。本文将向你展示如何掌握这两种方法。如果你是 CameraX 新手,可以先阅读CameraX 概述快速上手。

慢动作原理

慢动作的基本原理是以远高于播放帧率的帧率来录制视频。例如,如果你以每秒 120 帧 (fps) 的帧率录制一个一秒钟的事件,然后以标准的 30 fps 播放该录像,则视频需要四秒钟才能播放完毕。这种时间的“拉伸”正是慢动作效果的来源,让你能够看到肉眼无法捕捉到的快速细节。

为确保最终输出视频流畅自然,通常应以至少 30 fps 的帧率进行渲染。这意味着,要制作 4 倍慢动作视频,原始拍摄帧率必须至少为 120 fps(120 fps 拍摄帧率 ÷ 4 = 30 fps 播放帧率)。

拍摄高帧率素材后,主要有两种方法可以实现所需效果:

  • 播放器控制的慢动作(高帧率视频):高速录制的视频(例如 120 fps)直接保存为高帧率视频文件。然后,视频播放器负责降低播放速度。这样,用户可以灵活地在正常播放和慢动作播放之间切换。
  • 即用型慢动作(重新编码的视频):高速视频流经过处理和重新编码,生成标准帧率(例如 30 fps)的文件。慢动作效果是通过调整帧时间戳“嵌入”到视频中的。生成的视频无需特殊处理即可在任何标准视频播放器中以慢动作播放。虽然视频默认以慢动作播放,但视频播放器仍然可以提供播放速度控制,允许用户加快播放速度并以原始速度观看视频。

CameraX API 简化了这一过程,为你提供了一种统一的方式来选择所需的播放方式,如下所示。

全新高速视频 API

全新的 CameraX 解决方案基于两个主要组件:

  • Recorder#getHighSpeedVideoCapabilities(CameraInfo): 此方法用于检查摄像头是否支持高速录制,如果支持,则可查看支持哪些分辨率(Quality 对象)。
  • HighSpeedVideoSessionConfig: 这是一个特殊的配置对象,用于将你的 VideoCapture 和 Preview 使用场景分组,并指示 CameraX 创建一个统一的高速摄像头会话。请注意,虽然 VideoCapture 流将以配置的高帧率运行,但为了确保屏幕流畅显示,预览流通常会被摄像头系统限制在至少 30 FPS 的标准帧率。

入门指南

开始之前,请确保已将必要的 CameraX 依赖项添加到应用程序的 build.gradle.kts 文件中。你需要 camera-video 组件以及 CameraX 核心库。

1// build.gradle.kts (Module: app)
2
3
4dependencies {
5
6    val camerax_version = "1.5.1"
7
8
9    implementation("androidx.camera:camera-core:$camerax_version")
10
11    implementation("androidx.camera:camera-camera2:$camerax_version")
12
13    implementation("androidx.camera:camera-lifecycle:$camerax_version")
14
15    implementation("androidx.camera:camera-video:$camerax_version")
16
17    implementation("androidx.camera:camera-view:$camerax_version")
18
19}
20

关于实验性 API 的说明

需要注意的是,高速录制 API 目前处于实验阶段。这意味着它们在未来的版本中可能会发生变化。要使用它们,你必须通过在代码中添加以下注释来启用它们:

1@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)
2

具体实现

两种结果的实现都从相同的设置步骤开始。创建高帧率视频还是慢动作视频的选择取决于一个设置。

1.设置高速拍摄

首先,无论你的目标是什么,你都需要获取 ProcessCameraProvider,检查设备功能,并创建你的使用场景。

以下代码块展示了在挂起函数中的完整设置流程。你可以从协程作用域调用此函数,例如 lifecycleScope.launch

1// Add the OptIn annotation at the top of your function or class
2
3@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)
4
5private suspend fun setupCamera() {
6
7    // Asynchronously get the CameraProvider
8
9    val cameraProvider = ProcessCameraProvider.awaitInstance(this)
10
11
12    // -- CHECK CAPABILITIES --
13
14    val cameraInfo = cameraProvider.getCameraInfo(CameraSelector.DEFAULT_BACK_CAMERA)
15
16    val videoCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)
17
18    if (videoCapabilities == null) {
19
20        // This camera device does not support high-speed video.
21
22        return
23
24    }
25
26
27    // -- CREATE USE CASES --
28
29    val preview = Preview.Builder().build()    
30
31
32    // You can create a Recorder with default settings.
33
34    // CameraX will automatically select a suitable quality.
35
36    val recorder = Recorder.Builder().build()
37
38
39    // Alternatively, to use a specific resolution, you can configure the
40    // Recorder with a QualitySelector. This is useful if your app has
41    // specific resolution requirements or you want to offer user
42    // preferences. 
43
44    // To use a specific quality, you can uncomment the following lines.
45
46    // Get the list of qualities supported for high-speed video. 
47
48    // val supportedQualities = videoCapabilities.getSupportedQualities(DynamicRange.SDR)
49
50    // Build the Recorder using the quality from the supported list.
51
52    // val recorderWithQuality = Recorder.Builder()
53
54    //     .setQualitySelector(QualitySelector.from(supportedQualities.first()))
55
56    //     .build()
57
58
59    // Create the VideoCapture use case, using either recorder or recorderWithQuality
60
61    val videoCapture = VideoCapture.withOutput(recorder)
62
63    // Now you are ready to configure the session for your desired output...
64
65}
66

2. 选择输出

现在,你需要决定要创建哪种类型的视频。此代码将在上面所示的 setupCamera()suspend 函数中运行。

选项 A:创建高帧率视频

如果你希望最终文件具有高帧率(例如,120fps 的视频),请选择此选项。

1// Create a builder for the high-speed session
2
3val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)
4
5    .setPreview(preview)
6
7
8// Query and apply a supported frame rate. Common supported frame rates include 120 and 240 fps.
9
10val supportedFrameRateRanges =
11
12    cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())
13
14
15sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())
16

选项 B:创建可直接播放的慢动作视频

如果你希望视频在任何标准视频播放器中自动以慢动作播放,请选择此选项。

1// Create a builder for the high-speed session
2
3val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)
4
5    .setPreview(preview)
6
7
8// This is the key: enable automatic slow-motion!
9
10sessionConfigBuilder.setSlowMotionEnabled(true)
11
12
13// Query and apply a supported frame rate. Common supported frame rates include 120, 240, and 480 fps.
14
15val supportedFrameRateRanges =
16
17   cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())
18
19sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())
20
21

这个标志位是创建可直接播放的慢动作视频的关键。当 setSlowMotionEnabled 设置为 true 时,CameraX 会处理高速视频流并将其保存为标准的 30 fps 视频文件。慢动作播放速度由拍摄帧速率与标准播放速率的比值决定。

例如:

  • 以 120 fps 录制的视频将以 1/4 倍速播放 (120 ÷ 30 = 4)。
  • 以 240 fps 录制的视频将以 1/8 倍速播放 (240 ÷ 30 = 8)。

整合所有步骤:录制视频

配置好 HighSpeedVideoSessionConfig 并将其绑定到生命周期后,最后一步就是开始录制。准备输出选项、开始录制和处理视频事件的过程与标准视频捕获相同。

本文重点介绍高速配置,因此不会详细介绍录制过程。如需了解从准备 FileOutputOptions 或 MediaStoreOutputOptions 对象到处理 VideoRecordEvent 回调的完整指南,请参阅VideoCapture 文档

1// Bind the session config to the lifecycle
2
3cameraProvider.bindToLifecycle(
4
5    this as LifecycleOwner,
6
7    CameraSelector.DEFAULT_BACK_CAMERA,
8
9    sessionConfigBuilder.build() // Bind the config object from Option A or B
10
11)
12
13
14// Start the recording using the VideoCapture use case
15
16val recording = videoCapture.output
17
18    .prepareRecording(context, outputOptions) // See docs for creating outputOptions
19
20    .start(ContextCompat.getMainExecutor(context)) { recordEvent ->
21
22        // Handle recording events (e.g., Start, Pause, Finalize)
23
24    }
25

Google Photos 对慢动作视频的支持

在 CameraX 中启用 setSlowMotionEnabled(true) 后,生成的视频文件将被设计为可在标准视频播放器和图库应用中立即识别并播放为慢动作视频。谷歌相册尤其针对慢动作视频提供了增强功能,当拍摄帧速率为 120、240、360、480 或 960fps 时,功能更加完善:

  • 缩略图中的独特 UI 识别:在谷歌相册中,慢动作视频会通过特定的 UI 元素进行识别,从而与普通视频区分开来。

普通视频缩略图

慢动作视频缩略图

  • 播放时可调整速度:播放慢动作视频时,Google Photos 提供控制选项,允许用户调整视频中哪些部分以慢速播放,哪些部分以正常速度播放,从而赋予用户更大的创作自由。编辑后的视频可以使用“分享”按钮导出为新的视频文件,同时保留你定义的慢动作片段。

正常视频播放

慢动作视频播放(带编辑控制)转存失败,建议直接上传图片文件

关于设备支持的说明

CameraX 的高速 API 依赖于底层 Android 的 CamcorderProfile 系统来确定设备支持的高速分辨率和帧速率。CamcorderProfile 经过 Android 兼容性测试套件 (CTS) 的验证,这意味着你可以信赖设备所报告的视频录制功能。

这意味着,设备内置相机应用能够录制慢动作视频并不能保证 CameraX 高速 API 能够正常工作。出现这种差异的原因是,设备制造商负责在其设备固件中填充 CamcorderProfile 条目,而有时必要的高速配置文件(例如 CamcorderProfile.QUALITY_HIGH_SPEED_1080P 和 CamcorderProfile.QUALITY_HIGH_SPEED_720P)可能并未包含在内。当缺少这些配置文件时,Recorder.getHighSpeedVideoCapabilities() 将返回 null。

因此,务必始终使用 Recorder.getHighSpeedVideoCapabilities() 以编程方式检查支持的功能,因为这是确保在不同设备上获得一致体验的最可靠方法。如果尝试在 Recorder.getHighSpeedVideoCapabilities() 返回 null 的设备上绑定 HighSpeedVideoSessionConfig,则操作将失败并抛出 IllegalArgumentException 异常。你可以在 Google Pixel 设备上确认支持,因为它们始终包含这些高速配置文件。此外,其他制造商的各种设备,例如 Motorola Edge 30、OPPO Find N2 Flip 和 Sony Xperia 1 V,也支持高速视频功能。

结论

CameraX 高速视频 API 功能强大且灵活。无论你是需要用于技术分析的真正高帧率视频素材,还是想为你的应用添加电影级的慢动作效果,HighSpeedVideoSessionConfig 都能提供统一且简便的解决方案。通过了解 setSlowMotionEnabled 标志的作用,你可以轻松支持这两种使用场景,并赋予用户更大的创作自由。

欢迎搜索并关注 公众号「稀有猿诉」 获取更多的优质文章!

保护原创,请勿转载!


使用CameraX 1.5进行高速拍摄和慢动作视频拍摄》 是转载文章,点击查看原文


相关推荐


MPK(Mirage Persistent Kernel)源码笔记(4)--- 转译系统
罗西的思考2025/10/31

MPK(Mirage Persistent Kernel)源码笔记(4)--- 转译系统 0x00 概要 0x01 Task和Event 1.1 可执行任务 1.2 事件 0x02 生成CUDA代码 2.1 生成代码 2.2 注册代码 2.3 获取代码 0x03 生成任务图 3.1 入口 3.2 runtime.cc主体 3.3 建立依赖关系 3.4 输出代码 0xFF 参考 0x00 概要 此处的”转译系统“包含两部分: 把计算图转换为任务图。 将 Mir


目标使用过期的TLS1.0 版协议
oneslide2025/10/29

文章目录 目标使用过期的TLS1.0 版协议详细描述解决办法启用测试办法注意事项 目标主机支持RSA密钥交换详细描述解决办法 目标使用过期的TLS1.0 版协议 详细描述 该插件连接到目标主机服务,检测到目标服务加密通信使用的SSL加密算法。 远程服务利用旧版 TLS 加密流量。 解决办法 启用 TLS 1.2 和/或 1.3 支持,禁用 TLS 1.0 支持 nginx样例配置如下: server { list


LabVIEW开发双光子成像
LabVIEW开发2025/10/26

双光子成像技术作为一种先进的光学成像手段,广泛应用于生物医学研究领域,尤其适用于活体细胞与组织的成像研究。LabVIEW软件在双光子成像系统中的应用,涵盖系统设计、数据采集、图像处理及用户界面开发等核心环节。 双光子原理 双光子成像技术基于双光子吸收效应:当两个光子近乎同时被荧光分子吸收时,可激发该分子产生荧光。该技术的核心优势在于能够实现深层组织的高分辨率成像 —— 较长波长的光在生物组织中散射程度更低,从而具备更强的组织穿透能力。 LabVIEW开发 在双光子成像系统中,La


有哪些开源项目提供即插即用的 qss 模板文件
hmoexyz2025/10/23

有哪些开源项目提供即插即用的 qss 模板文件 Qt 的 .qss(Qt Style Sheet)文件类似于 CSS,用于自定义 Qt 应用的界面样式。虽然 Qt 官方没有一个专门的 QSS 模板库,但社区中确实存在一些优秀的开源项目提供了丰富的 QSS 样式模板,可直接使用或作为参考。 以下是几个值得一看的开源项目或资源: 🎯 1. QtTheme 项目地址:https://github.com/hubenchang0515/QtTheme 简介:纯 qss 的 Qt 主题。


亚马逊云代理商:怎么快速构建高安全区块链应用?
TG_yunshuguoji2025/10/22

作为全球领先的云计算平台,亚马逊云(AWS)为区块链应用开发提供了全方位支持。它为企业提供了从需要去中心化信任的多方协作网络(Managed Blockchain)到仅需不可篡改数据记录的内部应用(QLDB)的完整解决方案谱系。如果你还没有AWS账号或上云实际使用云服务过程中有不懂的,可寻云枢国际免卡上云用云以及获得专业的技术支持和折扣。 一、AWS区块链核心优势 1. 安全性 2. 可扩展性 3. 完全托管服务,降低开发运维难度 4. 与其他AWS服务无缝集成 二、四大核心服务


如何用python来做小游戏
你才是向阳花2025/10/21

本文重点内容:pygame 前情准备:我们需要安装好python,没有安装?传送门➡️ https://blog.csdn.net/weixin_54714100/article/details/152517550 如果我们安装成功了python,那么我们就可以用【pip】指令完成pygame的安装 pip install pygame // Windows pip3 install pygame // macOs 一个简单的小游戏: 绘制一个小球,通过方向键控制小球的移动


Endnote | word中加载项消失不见,如何处理?
跳动的喵尾巴2025/10/20

Endnote | word中加载项消失不见的几种问题及处理方法 一、Endnote在word中不出现的报错内容1.1 报错问题及安装版本1.2 问题分析1.2.1 EndNote 未重新安装1.2.2 Endnote.oxt 文件不是 Word 可识别格式1.2.3 Word 插件目录错误或损坏 二、解决方案2.1 重新安装 EndNote(最彻底)2.2 安装Endnote,在Word工具栏中未出现2.3 笔者遇到的问题——系统重装,Endnote未重新安装,在Word工具栏中未


申威(sw_64)架构下如何安装java-1.8.0-swjdk的rpm包?​
用户31187945592182025/10/18

​ 专门为申威(sw_64)架构的电脑打造的Java 8运行环境。 ​1. 下载文件​ 安装包下载:pan.quark.cn/s/936281541… ,确保你已经下载了 java-1.8.0-swjdk-8u212-8.ky10.sw_64.rpm,并记住它放在哪个文件夹里(比如“下载”)。 ​2. 打开终端​ 按 Ctrl + Alt + T打开终端,进入你放文件的目录: cd ~/下载 # 如果放在“下载”文件夹 ​3. 安装 RPM 包​ 运行安装命令(需要输入密码): sudo


SpringCloud系列(52)--SpringCloud Sleuth简介
Ken_11152025/10/17

前言:在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败,所以我们需要一种技术来对链路的调用进行监控 1、SpringCloud Sleuth SpringCloud Sleuth提供了—套完整的服务跟踪的解决方案,在分布式系统中提供追踪解决方案并且兼容支持了zipkin(SpringCloud Sleuth负责收集链路调用


【visibilitychange】:获取当前页面可见性,深入解析,提升网页性能与用户体验的关键事件
❆VE❆2025/10/16

目录 第一章 前言 第二章 visibilitychange 事件简介 第三章 触发visibilitychange变更的情况 第四章 应用场景 4.1 优化资源加载 4.2 节省服务器资源 4.3 改善用户体验 第五章 实现细节 5.1 兼容性 5.2 性能优化 第六章 典例 第七章 总结 第一章 前言 在现代网页开发中,提升用户体验和优化性能是至关重要的目标。visibilitychange事件作为浏览器提供的一个强大工具,能够帮助开发者实现这些目标。小编

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0