AVFoundation — 是苹果的多媒体框架,提供在 iOS、macOS、tvOS 和 watchOS 上处理音频、视频和图像的完整工作周期。它涵盖从摄像头和麦克风捕获、媒体文件播放、音轨编辑、实时音频处理到网络流媒体。根据 Apple AVFoundation Documentation (2026),该框架用于 90% 处理媒体内容的 App Store 应用。
要点
AVFoundation — 是苹果的基础多媒体框架,早在 iOS 4(2010)中引入,作为过时的 UIWebView 的替代品用于音频和视频播放。从那时起,AVFoundation 已演变为一套完整的工具,用于处理任何类型的媒体:从简单的 MP3 文件播放到使用多通道麦克风进行专业视频捕获以及通过实时效果进行声音转换。
AVFoundation 的架构围绕几个基本抽象构建:AVAsset(媒体数据)、AVPlayer(播放)、AVCaptureSession(捕获)和 AVAudioEngine(处理)。每个组件都异步工作,这对于在加载或处理大文件期间保持 UI 流畅性至关重要。据苹果(WWDC 2025)称,AVFoundation 在配备 M 系列芯片的设备上处理高达 8K 的视频而不会损失性能。
AVFoundation 提供从摄像头捕获视频,支持 4K ProRes、HDR 和高达 240 FPS 的慢动作,从内置和外部麦克风录制和混音音频,支持 HLS、MPEG-4、QuickTime、MP3、AAC 和 FLAC 的媒体播放,通过 AVAssetExportSession 导出和转换文件,通过 AVAudioEngine 进行实时音频处理,带有混响、均衡器和变调效果,以及通过 AirPlay 和网络协议进行流媒体播放。
AVFoundation 由多个模块组成,每个模块负责媒体工作的特定领域。组件的选择取决于任务:捕获、播放、导出或实时处理。
| 组件 | 用途 | 关键类 |
|---|---|---|
| 捕获 | 使用摄像头和麦克风 | AVCaptureSession |
| 播放 | 音频和视频播放器 | AVPlayer / AVAudioPlayer |
| 编辑 | 合成和剪辑 | AVMutableComposition |
| 导出 | 转换为其他格式 | AVAssetExportSession |
| 音频引擎 | 实时声音处理 | AVAudioEngine |
| 元数据 | 读取 ID3、EXIF 和 XMP | AVMetadataItem |
AVCaptureSession — 用于捕获视频和音频的中心对象。它管理来自物理设备(摄像头、麦克风)的传入数据流,配置它们的设置(分辨率、FPS、格式)并将其定向到输出:预览(AVCaptureVideoPreviewLayer)、录制到文件(AVCaptureMovieFileOutput)或逐帧处理(AVCaptureVideoDataOutput)。
AVPlayer — 通用的 AVFoundation 播放器,能够本地和通过网络播放媒体内容。AVPlayer 支持 HLS 流媒体、MPEG-4、QuickTime Movie 和大多数音频格式。播放控制通过 AVPlayerItem 异步进行。AVPlayerViewController 提供带有控制元素的现成 UI:播放/暂停、滚动、AirPlay 和 PiP。
视频和音频捕获 — AVFoundation 最受欢迎的功能之一。配置捕获会话包括几个步骤:创建 AVCaptureSession、添加输入(摄像头、麦克风)、设置输出和启动会话。
让我们逐步查看 AVCaptureSession 的配置,用于从 iPhone 后置摄像头捕获视频并同时从麦克风录制声音。该过程包括 Swift 中的四个步骤。
import AVFoundation
// 1. 创建和配置会话
let session = AVCaptureSession()
session.sessionPreset = .hd1920x1080
// 2. 添加摄像头输入
guard let camera = AVCaptureDevice.default(
for: .video
) else { return }
let cameraInput = try? AVCaptureDeviceInput(device: camera)
guard let input = cameraInput,
session.canAddInput(input)
else { return }
session.addInput(input)
// 3. 添加录制输出
let output = AVCaptureMovieFileOutput()
guard session.canAddOutput(output) else { return }
session.addOutput(output)
// 4. 启动会话
session.startRunning()
Swift 代码创建一个带有 Full HD 预设的 AVCaptureSession,连接后置摄像头作为视频源,并添加用于录制到文件的输出。启动 session.startRunning() 后,摄像头开始将帧发送到预览和输出文件。录制停止通过 output.stopRecording() 进行,可保存到相册。
对于仅捕获音频(无视频),在 AVCaptureSession 中仅通过 AVCaptureDevice.default(.audio) 添加麦克风。输出为 AVAudioFileOutput 或 AVCaptureAudioDataOutput 用于实时声音处理。AVFoundation 支持多通道捕获:iPad Pro 上最多 8 个音频通道,iPhone 上最多 2 个,允许通过 Lightning、USB-C 或 Bluetooth 连接器从外部麦克风录制立体声。输入信号源的选择通过 AVAudioSession.sharedInstance().setPreferredInput 进行,这对于使用外部耳机和蓝牙麦克风的应用程序至关重要。
AVFoundation 提供两种主要的媒体播放方式:AVPlayer 用于视频,AVAudioPlayer 用于音频。让我们看一下通过 AVPlayer 播放远程 HLS 流的示例。
代码创建一个 AVPlayer,从 URL 加载 HLS 流,并以降低的音量开始播放。AVPlayerItem 管理加载和缓冲状态,KVO 状态观察允许处理错误。
import AVFoundation
import AVKit
// 1. 创建带 HLS 流的 AVPlayer
let url = URL(
string: "https://example.com/stream.m3u8"
) !
let player = AVPlayer(url: url)
player.volume = 0.7
// 2. 播放
player.play()
// 3. 显示播放器
let playerVC = AVPlayerViewController()
playerVC.player = player
present(playerVC, animated: true)
// 4. 监控状态
player.currentItem?.addObserver(
self,
forKeyPath: "status",
options: .new,
context: nil
)
代码创建一个带有 HLS URL 的 AVPlayer,将音量设置为 70% 并开始播放。AVPlayerViewController 提供带有控制元素、AirPlay 和画中画模式的内置 UI。播放器状态通过 KVO 监控,以处理 HLS 流暂时不可用的情况。
对于不带视频界面的音频播放,使用 AVAudioPlayer — 一个不需要 AVPlayerItem 的轻量级播放器。AVAudioPlayer 支持 MP3、AAC、ALAC、FLAC、WAV 和 AIFF 音频格式,提供 play()、pause() 和 stop() 方法,以及 AVAudioPlayerDelegate 协议用于跟踪播放完成和解码错误。AVAudioPlayer 非常适合在 iOS 和 macOS 上播放背景音乐、播客和游戏音效。
让我们再看两个使用 AVFoundation 的典型场景:通过 AVAudioEngine 进行音频处理和将视频导出为其他格式。
AVAudioEngine 通过在处理图中连接节点实现实时音频处理:输入节点(麦克风)→ 效果 → 输出节点(扬声器)。在下面的示例中,为声音添加了混响效果。
let engine = AVAudioEngine()
let reverb = AVAudioUnitReverb()
// 混响设置
reverb.loadFactoryPreset(.largeHall)
reverb.wetDryMix = 40
// 连接:麦克风 -> 混响 -> 扬声器
engine.attach(reverb)
engine.connect(
engine.inputNode,
to: reverb,
format: nil
)
engine.connect(
reverb,
to: engine.mainMixerNode,
format: nil
)
try? engine.start()
AVAudioEngine 创建一个由三个节点组成的图:输入(麦克风)、效果(大厅预设的混响)和输出(扬声器)。在 engine.start() 之后,来自麦克风的声音由效果实时处理并输出到设备的耳机或扬声器。在所有现代 Apple 设备上,处理延迟小于 10 毫秒。
AVAudioEngine 的另一个功能 — 通过 AVAudioUnitEQ 和 AVAudioUnitMixer 进行声音分析。开发人员可以向任何音频流添加均衡器、压缩器和限制器。对于音乐应用程序,AVFoundation 提供 AVAudioSequencer 用于播放 MIDI 文件和 AVSpeechSynthesizer 用于语音合成。所有组件在单个音频图中工作,在 Apple 设备上提供小于 5 毫秒的捕获和处理延迟。
在使用 AVFoundation 时,重要的是要考虑系统权限:访问摄像头需要在 Info.plist 中使用 NSCameraUsageDescription,麦克风使用 NSMicrophoneUsageDescription。AVFoundation 在首次尝试访问设备时自动显示系统权限请求对话框。用户拒绝通过 AVCaptureDevice.authorizationStatus() 处理,允许正确显示摄像头不可用的消息,并提供转到设置的建议。
AVFoundation 通过项目 Capabilities 中的 Audio Background Mode 支持后台音频播放。激活只需在 UIBackgroundModes Info.plist 中添加 audio 记录并使用 .playback 类别配置 AVAudioSession。默认情况下视频不会在后台播放,但可以在 iPad 上使用 AVPlayer 的 pictureInPicture 模式在最小化应用中继续显示视频。PiP 模式图标通过 AVPictureInPictureController 和协议委托进行配置。
常见问题
iOS 4+ 用于基本播放和捕获。iOS 8+ 用于 AVAudioEngine。iOS 17+ 用于 HDR 模式下的 AVAssetWriter。该框架的当前版本在所有 iPhone、iPad 和 Mac 设备上均受支持。
可以,AVPlayer 支持 HLS(HTTP Live Streaming)— Apple 的主要流媒体协议。要将媒体发送到服务器,请使用 AVAssetWriter 配合基于 URLSession 的自定义协议。
AVFoundation — 是用于处理媒体的底层框架。AVKit — 是 AVFoundation 之上的层,提供现成的 UI 组件:AVPlayerViewController、AVPictureInPictureController 和 AVPipView。
支持,从 iOS 11 开始 AVFoundation 支持 FLAC(Free Lossless Audio Codec)播放。ALAC(Apple Lossless)从 iOS 4 开始支持。两种编解码器均可通过 AVAudioPlayer 和 AVPlayer 使用。
通过 ReplayKit 的 RPScreenRecorder,它在内部使用 AVFoundation。从 iOS 9 开始,屏幕录制可通过 RPScreenRecorder.shared().startRecording() 使用,可选择麦克风。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。