iOS 慢动作与延时摄影实现细节全解析:AVCaptureHighFrameRateVideo 与时间压缩控制实践

关键词
iOS 慢动作摄影、Time Lapse、AVCaptureDeviceFormat、AVCaptureMovieFileOutput、慢帧率采集、高帧率视频、高速拍摄、帧时间重映射、视频压缩、iPhone 视频采集

摘要
在移动影像系统中,“慢动作(Slow Motion)”与“延时摄影(Time Lapse)”作为两种对时间进行非线性处理的拍摄模式,已经广泛应用于运动分析、创意视频制作和工业场景记录中。iOS 平台通过 AVCaptureDevice 的高帧率采集能力(如 120fps、240fps)与 AVFoundation 提供的帧率压缩机制,为开发者提供了灵活且性能稳定的慢动作与延时拍摄方案。
本文将详细解析 iOS 平台如何在硬件层面实现慢动作采集、高帧率配置、延时帧率压缩等关键机制,结合实际代码和测试数据,讲解如何基于 AVFoundation 框架构建一个支持 Slow Motion 与 Time Lapse 的视频拍摄系统,支持后处理与实时编码,同时提供工程落地建议。


目录

  1. iOS 视频时间控制能力演进概览
  2. 高帧率视频采集机制:AVCaptureDeviceFormat 详解
  3. 慢动作拍摄流程:120fps / 240fps 配置与数据编码
  4. 延时摄影机制:采样频率控制与帧时间重映射原理
  5. AVFoundation 中帧率配置的常见误区与调试技巧
  6. 慢动作 + HDR / EIS 协同处理能力分析(以 iPhone 15 为例)
  7. 工程实战案例:自定义 Slow Motion/Time Lapse 模式实现
  8. 性能优化与编码策略建议:码率控制与写入稳定性保障

1. iOS 视频时间控制能力演进概览

在 iOS 平台的影像系统中,视频时间控制能力的核心演进,主要体现在两个方面:

  • 高帧率视频采集支持(针对慢动作/Slow Motion)
  • 低采样率时间压缩输出机制(针对延时摄影/Time Lapse)
历史演进路径
  • iOS 7(iPhone 5s)
    引入 120fps 高帧率拍摄能力,配合 AVFoundation 的 AVCaptureDeviceFormat 接口,首次实现开发者可控的慢动作采集。

  • iOS 8(iPhone 6)
    支持 240fps 拍摄,并开放更细粒度的帧率与分辨率配置能力,用户在相机 App 内可选择 720p@240fps。

  • iOS 10–14(iPhone X–11 系列)
    加入更复杂的时间压缩控制机制,延时摄影可通过调整帧间采样速率(如 2s 采一帧),并在编码阶段动态重映射时间戳。

  • iOS 15 之后(iPhone 13 Pro 起)
    引入 ProRes 编码 + 高帧率 RAW 视频支持,在慢动作视频中可携带更高动态范围(HDR)与更多帧间元数据,便于后期调色与分析。

API 层支持体系

慢动作与延时拍摄均基于 AVFoundation 框架实现,其核心涉及以下几个组件:

功能模块使用组件
高帧率采集AVCaptureDevice.activeFormat + activeVideoMinFrameDuration
延时拍摄AVCaptureVideoDataOutput + 时间戳过滤或 AVAssetWriter 手动控制
视频写入编码AVCaptureMovieFileOutputAVAssetWriter
时间重映射CMTimeScale 控制帧间距 + 播放帧率控制

在后续章节中,将结合具体采集设备(如 iPhone 15 Pro)与最新 iOS SDK 能力,展开讲解 iOS 如何实现稳定的高帧率 Slow Motion 和高压缩比 Time Lapse 功能。


2. 高帧率视频采集机制:AVCaptureDeviceFormat 详解

慢动作拍摄的关键在于高帧率采集能力(120fps/240fps),该能力并不是所有 iOS 设备默认支持的,而是与 AVCaptureDeviceFormat 紧密绑定。

可用高帧率格式的查询方式

通过如下代码,可动态列出当前设备支持的所有视频格式及其帧率上限:

let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
for format in videoDevice?.formats ?? [] {
    let ranges = format.videoSupportedFrameRateRanges
    for range in ranges {
        if range.maxFrameRate >= 120 {
            print("支持高帧率:\(format.formatDescription) @ \(range.minFrameRate)~\(range.maxFrameRate)")
        }
    }
}

输出中格式信息包含分辨率、压缩类型(如 H264、ProRes)、最大帧率等,是配置高帧率采集的依据。

设置高帧率采集参数

选定格式后,需设置设备的 activeFormat 并强制设定采集帧率:

try videoDevice.lockForConfiguration()
videoDevice.activeFormat = selectedFormat
videoDevice.activeVideoMinFrameDuration = CMTimeMake(value: 1, timescale: 240)
videoDevice.activeVideoMaxFrameDuration = CMTimeMake(value: 1, timescale: 240)
videoDevice.unlockForConfiguration()

以上代码将设备采集帧率锁定为 240fps。需注意几点:

  • 必须先设置 activeFormat 才能调整帧率;
  • 不支持该帧率的设备(如低端 iPad)会抛出异常;
  • 使用 AVCaptureMovieFileOutputAVAssetWriter 时,要确认编码器支持目标帧率与分辨率。
注意事项
  • 部分高帧率格式默认不开启音频录制,需自行添加音频 Input;
  • 240fps 模式通常限制为 720p 分辨率,1080p 常为 120fps 封顶;
  • 若使用 HEVC 编码,高帧率时设备会自动降低编码质量以平衡码率压力。

通过合理配置 AVCaptureDeviceFormat,并搭配高性能的编码模块,开发者即可构建高质量的慢动作采集流程。

3. 慢动作拍摄流程:120fps / 240fps 配置与数据编码

实现慢动作拍摄的核心流程不仅在于采集帧率的提升,还包括对视频的正确编码与回放速度的控制。iOS 原生相机通过高帧率采集 + 标准帧率编码的组合,构建了慢动作视觉体验。

核心原理:高采集 + 标准播放
  • 采集阶段:以 120fps 或 240fps 进行图像采集(通过 AVCaptureDevice 设置);
  • 编码阶段:将采集到的高帧率帧以 30fps 或 60fps 的标准播放速率编码;
  • 播放效果:视觉上形成 4×/8× 慢动作效果。

例如,采集 240fps 1 秒钟的视频(共 240 帧),如果按照 30fps 播放,则视频长度为 8 秒,形成 1:8 的时间延展比。

配置步骤与关键代码
  1. 选择支持的高帧率格式并设置
videoDevice.activeFormat = targetFormat
videoDevice.activeVideoMinFrameDuration = CMTimeMake(value: 1, timescale: 240)
videoDevice.activeVideoMaxFrameDuration = CMTimeMake(value: 1, timescale: 240)

  1. 配置 AVCaptureSession 输出模块

推荐使用 AVCaptureMovieFileOutput,其默认按照标准帧率编码,自动完成慢动作效果。

let movieOutput = AVCaptureMovieFileOutput()
if captureSession.canAddOutput(movieOutput) {
    captureSession.addOutput(movieOutput)
}

  1. 启动录制并指定存储路径
let outputURL = FileManager.default.temporaryDirectory.appendingPathComponent("slowMotion.mov")
movieOutput.startRecording(to: outputURL, recordingDelegate: self)

  1. 导出视频并校验帧率

通过 AVAsset 分析最终输出的视频:

let asset = AVAsset(url: outputURL)
let track = asset.tracks(withMediaType: .video).first
print("实际播放帧率:\(track?.nominalFrameRate ?? 0)")

如显示为 30fps 或 60fps,则慢动作编码成功。

使用 AVAssetWriter 实现更高阶控制

对于专业需求,可使用 AVAssetWriter 手动编码采集到的帧,设置更细致的时间戳、码率与音视频同步策略,但开发复杂度明显提升。


4. 延时摄影机制:采样频率控制与帧时间重映射原理

延时摄影的核心原理在于“低频率采样 + 标准频率播放”,即采集帧率远低于编码帧率,实现时间压缩视觉效果。

举例说明
  • 采样频率:每 2 秒采集 1 帧(0.5fps)
  • 编码帧率:输出为 30fps
  • 时间压缩倍率:60×,即 1 分钟真实时间被压缩为 1 秒播放内容
实现方式一:定时丢帧采集

AVCaptureVideoDataOutput 的回调中,根据帧时间戳选择性处理帧,例如:

var lastCaptureTime: CMTime = .zero

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    let timestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
    if CMTimeCompare(timestamp - lastCaptureTime, CMTimeMake(value: 2, timescale: 1)) >= 0 {
        // 满 2 秒采一帧
        writeFrame(sampleBuffer)
        lastCaptureTime = timestamp
    }
}

缺点是会浪费大量未用帧,且对 CPU 资源管理较重。

实现方式二:定时拍摄图像帧并编码

使用 AVCapturePhotoOutput 或定时快门方式采集单帧图像,再合成延时视频,常用于静态场景、远景日落等长时间记录。

结合 AVAssetWriter,开发者可创建一个时间重映射的视频输出逻辑,设置每帧的时间戳:

let presentationTime = CMTimeMake(value: frameIndex * 1001, timescale: 30000) // 30fps 编码时间轴
writerInput.append(pixelBuffer, withPresentationTime: presentationTime)

通过该方式,即使真实帧间隔很大,也可在输出视频中保持流畅连续性。

延时摄影中的资源管理
  • 建议使用低分辨率(720p)采样,防止设备长时间运行过热;
  • 应开启 AVCaptureSessionPresetPhotoAVCaptureSessionPresetLow 减小图像压力;
  • 可结合后台任务模式,在屏幕锁定或进入后台时持续采样与写入。

延时摄影的实际性能表现严重依赖系统功耗调度与写入带宽,工程上建议使用 Metal 或 OpenGL 提前合成帧缓冲,提高写入效率与视觉一致性。

5. AVFoundation 中帧率配置的常见误区与调试技巧

在 iOS 上实现高帧率慢动作或低帧率延时摄影时,许多开发者会误认为设置 AVCaptureSessionPreset 就能控制帧率。实际上,AVFoundation 的帧率控制机制需要同时满足多个条件,否则容易出现“设置无效”“自动降帧”或“编码异常”等问题。

误区一:设置帧率但未更改设备 Format

仅通过设置 activeVideoMinFrameDuration,未切换至支持高帧率的 AVCaptureDeviceFormat,系统将忽略帧率设定。

// 错误做法
videoDevice.activeVideoMinFrameDuration = CMTimeMake(value: 1, timescale: 240)

必须首先设置支持该帧率的 format:

videoDevice.activeFormat = highFPSFormat
videoDevice.activeVideoMinFrameDuration = CMTimeMake(value: 1, timescale: 240)
videoDevice.activeVideoMaxFrameDuration = CMTimeMake(value: 1, timescale: 240)

误区二:未配置稳定帧率范围导致帧率抖动

部分 format 的 videoSupportedFrameRateRanges 返回的是 [30...240] 这样的区间。如果不显式指定固定帧率,系统可能在性能变化下自动调整采集速率。

建议手动锁定:

let desiredFPS = 240
videoDevice.activeVideoMinFrameDuration = CMTimeMake(value: 1, timescale: Int32(desiredFPS))
videoDevice.activeVideoMaxFrameDuration = CMTimeMake(value: 1, timescale: Int32(desiredFPS))

误区三:MovieFileOutput 未捕捉高帧率帧流

AVCaptureMovieFileOutput 实际编码时,可能受限于设备硬件与编解码器性能。如果设备无法以 240fps 编码为 H.264,会自动降帧至 120fps 或 60fps。

建议使用 AVAssetWriter 并配置帧率参数:

let settings = [
    AVVideoCodecKey: AVVideoCodecType.h264,
    AVVideoWidthKey: 1280,
    AVVideoHeightKey: 720,
    AVVideoCompressionPropertiesKey: [
        AVVideoExpectedSourceFrameRateKey: 240
    ]
]

调试技巧
  1. 通过 AVCaptureVideoDataOutput 查看实时帧率
    利用帧时间戳差计算当前实际帧率,验证系统输出是否符合预期。

  2. 使用 Instruments 的 Time Profiler 和 Energy Log
    检测高帧率下是否因资源紧张导致掉帧或 CPU 占用激增。

  3. 检查视频输出文件的 metadata
    使用 AVAssetReader 或 ffmpeg 检查帧率与时间戳,确认编码是否正确落地。

通过对这些误区的识别和规避,开发者可显著提升高帧率与低频率视频输出的稳定性,确保慢动作与延时摄影功能按预期运行。


6. 慢动作 + HDR / EIS 协同处理能力分析(以 iPhone 15 为例)

在实际使用中,用户往往希望在拍摄慢动作视频时,仍能享受到 HDR(高动态范围成像)与 EIS(电子防抖)带来的图像质量提升。但这在工程实现上存在复杂的协同机制,特别是在高帧率采集下。

iPhone 15 系列支持能力概览
模式HDR 支持EIS 支持限制条件
1080p@120fps可用于慢动作 App
720p@240fps❌(部分)限制 HDR,防止 ISP 带宽过载
4K@60fps非慢动作,常用于高画质运动视频
HDR + 高帧率冲突机制

高帧率意味着 CMOS 每秒输出帧数更多,若启用 HDR(需拍多帧合成),Sensor 带宽和 ISP 会迅速饱和。iOS 系统在此场景下的行为为:

  • 自动降级 HDR:如从 Dolby Vision 降为普通 HEVC;
  • 限制帧率上限:如在 1080p 模式下强制限制为 120fps;
  • 禁用多帧合成,仅保留主帧采样输出。
EIS 与慢动作协同的原理

EIS 电子防抖依赖帧间对齐与图像裁剪机制,在高帧率下仍可工作。iOS 使用滚动缓存的方式处理帧延迟,允许在一定程度上维持抖动抑制能力。

关键点:

  • 必须保证相邻帧时间戳精确可预测;
  • 使用 AVCaptureConnection.videoStabilizationMode 设置为 .standard
  • iPhone 13 及以上设备默认开启,iOS 16 之后可通过设置 preferredStabilizationMode 强制开启或关闭。
let connection = videoOutput.connection(with: .video)
connection?.preferredVideoStabilizationMode = .standard

实战建议
  • 若目标是同时启用慢动作 + HDR,推荐使用 1080p@120fps,兼顾帧率与动态范围;
  • 对于 240fps 极限场景,可关闭 HDR 以稳定采集;
  • 如需最优图像质量,建议使用 AVCapturePhotoOutput + 帧拼接手动模拟慢动作(非实时);
  • 在写入阶段通过 ProRes 或 HEVC10bit 保留更多动态信息。

通过对系统能力边界的深度理解与合理配置,开发者可以在现代 iPhone 上实现更具专业表现力的慢动作摄影,同时保留画面稳定与高动态范围的质量保障。

7. 工程实战案例:自定义 Slow Motion/Time Lapse 模式实现

在实际 App 项目中,许多开发者希望跳出系统相机默认的模式限制,构建自定义的 Slow Motion 或 Time Lapse 拍摄功能,以满足特定的业务场景需求(如运动姿态分析、城市景观定格记录等)。下面以 Swift 语言为例,提供一个完整的高帧率慢动作采集与延时摄影工程组合方案。

Slow Motion 实现关键点
  1. Session 配置为高帧率支持格式:
guard let videoDevice = AVCaptureDevice.default(for: .video) else { return }

let targetFormat = videoDevice.formats.first {
    $0.videoSupportedFrameRateRanges.contains { $0.maxFrameRate >= 240 }
}

try videoDevice.lockForConfiguration()
videoDevice.activeFormat = targetFormat!
videoDevice.activeVideoMinFrameDuration = CMTimeMake(value: 1, timescale: 240)
videoDevice.activeVideoMaxFrameDuration = CMTimeMake(value: 1, timescale: 240)
videoDevice.unlockForConfiguration()

  1. 添加视频输出并开始录制:
let movieOutput = AVCaptureMovieFileOutput()
if session.canAddOutput(movieOutput) {
    session.addOutput(movieOutput)
}

let outputURL = FileManager.default.temporaryDirectory.appendingPathComponent("slow_motion.mov")
movieOutput.startRecording(to: outputURL, recordingDelegate: self)

录制结束后,视频即已编码为 240fps 的慢动作素材,通过系统播放器自动以 30fps 播放,展现出 8×时间膨胀效果。

Time Lapse 实现关键点

通过定时快门控制,定期采集图像帧并合成为视频。

  1. 使用 Timer 定时调用拍照:
Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { _ in
    let photoSettings = AVCapturePhotoSettings()
    self.photoOutput.capturePhoto(with: photoSettings, delegate: self)
}

  1. 采集图像帧后写入 AVAssetWriterInputPixelBufferAdaptor
let pixelBuffer = self.convertUIImageToCVPixelBuffer(image: capturedImage)
let presentationTime = CMTimeMake(value: frameIndex * 1001, timescale: 30000)
pixelBufferAdaptor.append(pixelBuffer, withPresentationTime: presentationTime)

  1. 最终通过 AVAssetWriter 封装为标准时间轴的视频文件:
writer.finishWriting {
    print("Time Lapse 视频生成完毕")
}

这种方式可灵活控制帧率、分辨率、帧间距等参数,非常适合构建可配置的延时拍摄工具。


8. 性能优化与编码策略建议:码率控制与写入稳定性保障

高帧率与长时间拍摄会对系统性能、能耗与稳定性提出挑战,开发者必须在工程层面做好资源控制与写入流程优化。

编码性能调优建议
  • 使用 H.264 时尽量控制分辨率不超 1080p,降低硬件编码压力
  • 在高帧率下推荐开启 AVVideoAllowFrameReorderingKey = false,减少帧乱序带来的缓存压力
  • 若支持 ProRes(iPhone 13 Pro 以上),建议优先选用 ProRes 422 HQ,避免色彩损失且帧间无压缩失真
  • HEVC 编码模式可通过 AVVideoProfileLevelKey = kHEVCMain10ProfileLevel5.1 提升动态范围表现
磁盘写入策略与节流机制
  • 对于 AVAssetWriter,应在主线程之外执行写入任务,避免 UI 卡顿;
  • 在写入前检查磁盘剩余空间,避免长时间 Time Lapse 拍摄中断;
  • 适当使用 GCD 队列节流写入任务,控制采集与写入的节奏一致,防止帧丢失:
writeQueue.async {
    if writerInput.isReadyForMoreMediaData {
        writerInput.append(sampleBuffer)
    }
}

电池与温控调度
  • 启用 isIdleTimerDisabled = true 防止锁屏;
  • 可选用低功耗设备(如 iPhone SE 3)测试长期延时拍摄下的发热与性能退化行为;
  • 避免高帧率 + 高码率 + HDR 同时开启,容易引发 CPU/GPU 频率限制与视频中断。

通过合理的编码策略与工程结构设计,开发者可在 iOS 系统中稳定、高质量地实现 Slow Motion 与 Time Lapse 的拍摄功能,兼顾视觉效果与系统可持续性,为用户提供专业的影像体验。

本文转自 https://zhxin.blog.csdn.net/article/details/148675629,如有侵权,请联系删除。