稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

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

本文译自「High-Speed Capture and Slow-Motion Video with CameraX 1.5」,原文链接https://android-developers.googleblog.com/2025/10/high-speed-capture-and-slow-motion.html,由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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// build.gradle.kts (Module: app)


dependencies {

    val camerax_version = "1.5.1"


    implementation("androidx.camera:camera-core:$camerax_version")

    implementation("androidx.camera:camera-camera2:$camerax_version")

    implementation("androidx.camera:camera-lifecycle:$camerax_version")

    implementation("androidx.camera:camera-video:$camerax_version")

    implementation("androidx.camera:camera-view:$camerax_version")

}

关于实验性 API 的说明

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

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

具体实现

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

1.设置高速拍摄

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Add the OptIn annotation at the top of your function or class

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

private suspend fun setupCamera() {

    // Asynchronously get the CameraProvider

    val cameraProvider = ProcessCameraProvider.awaitInstance(this)


    // -- CHECK CAPABILITIES --

    val cameraInfo = cameraProvider.getCameraInfo(CameraSelector.DEFAULT_BACK_CAMERA)

    val videoCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)

    if (videoCapabilities == null) {

        // This camera device does not support high-speed video.

        return

    }


    // -- CREATE USE CASES --

    val preview = Preview.Builder().build()


    // You can create a Recorder with default settings.

    // CameraX will automatically select a suitable quality.

    val recorder = Recorder.Builder().build()


    // Alternatively, to use a specific resolution, you can configure the
    // Recorder with a QualitySelector. This is useful if your app has
    // specific resolution requirements or you want to offer user
    // preferences. 

    // To use a specific quality, you can uncomment the following lines.

    // Get the list of qualities supported for high-speed video. 

    // val supportedQualities = videoCapabilities.getSupportedQualities(DynamicRange.SDR)

    // Build the Recorder using the quality from the supported list.

    // val recorderWithQuality = Recorder.Builder()

    //     .setQualitySelector(QualitySelector.from(supportedQualities.first()))

    //     .build()


    // Create the VideoCapture use case, using either recorder or recorderWithQuality

    val videoCapture = VideoCapture.withOutput(recorder)

    // Now you are ready to configure the session for your desired output...

}

2. 选择输出

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

选项 A:创建高帧率视频

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Create a builder for the high-speed session

val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)

    .setPreview(preview)


// Query and apply a supported frame rate. Common supported frame rates include 120 and 240 fps.

val supportedFrameRateRanges =

    cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())


sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Create a builder for the high-speed session

val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)

    .setPreview(preview)


// This is the key: enable automatic slow-motion!

sessionConfigBuilder.setSlowMotionEnabled(true)


// Query and apply a supported frame rate. Common supported frame rates include 120, 240, and 480 fps.

val supportedFrameRateRanges =

   cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())

sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())

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

例如:

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

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

整合所有步骤:录制视频

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Bind the session config to the lifecycle

cameraProvider.bindToLifecycle(

    this as LifecycleOwner,

    CameraSelector.DEFAULT_BACK_CAMERA,

    sessionConfigBuilder.build() // Bind the config object from Option A or B

)


// Start the recording using the VideoCapture use case

val recording = videoCapture.output

    .prepareRecording(context, outputOptions) // See docs for creating outputOptions

    .start(ContextCompat.getMainExecutor(context)) { recordEvent ->

        // Handle recording events (e.g., Start, Pause, Finalize)

    }

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 标志的作用,你可以轻松支持这两种使用场景,并赋予用户更大的创作自由。

Comments