Foundation — AVFAudio 和 AVFoundation

在 iOS 和 macOS 开发中,AVFoundationAVFAudio 都是用于处理音频和视频的框架,它们有一定的联系但功能和范围不同。这里我们通过 关系功能范围使用场景 来解释它们之间的联系与区别。


1. 二者的关系 #

  • AVFoundation 是一个更高层级的多媒体框架, 涵盖了音频、视频、字幕流的录制、播放、处理、编辑等功能。
  • AVFAudioAVFoundation 的音频子框架(或子模块)。 它专注于音频相关功能,负责音频的录制、播放、处理等。

从结构上看,AVFAudioAVFoundation 的一部分,用于处理音频相关的任务。因此,你可以认为 AVFAudioAVFoundation 提供的一部分功能,通过聚焦于音频操作来实现更细粒度的掌控。

  • 更直观地理解:
    • AVFoundation = 视频 + 音频(包括 AVFAudio)+ 流媒体 + 编辑工具 + 元数据等。
    • AVFAudio = 音频相关的功能模块,只是 AVFoundation 下的一部分。

2. 主要功能的范围划分 #

2.1. AVFoundation #

AVFoundation 是一个全面的框架,提供了完整的多媒体支持,包括音频和视频,广泛用于视频录制或播放、媒体编辑和数字媒体处理。

主要功能: #

  • 音频功能(通过 AVFAudio 子模块实现):
    • 播放音频
    • 录制音频
    • 音频处理(如音频效果)
  • 视频功能:
    • 视频的录制、编辑与播放
    • 视频的实时流媒体处理
  • 同步播放:
    • 将音频和视频流进行同步。
  • 媒体元数据处理:
    • 读取和写入多媒体文件的元数据(如文件标题、艺术家信息等)。
  • 高级多媒体编辑:
    • 混合音频、裁剪视频、合并多个媒体文件。

常用类: #

  • AVPlayer / AVQueuePlayer:用于播放视频或音频流。
  • AVPlayerItem:用于对每个播放单元的信息进行管理。
  • AVCaptureSession:实现音频、视频的采集。
  • AVAsset / AVMutableComposition:用于加载媒体文件/组合媒体片段。

适用场景: #

  • 视频播放器的开发(如实现一个音视频播放器)。
  • 音频/视频编辑器功能(如 iMovie)。
  • 视频录制(如通过摄像头录制视频)。
  • 读取多媒体文件的元数据。

2.2. AVFAudio #

AVFAudioAVFoundation 的一部分,但它专注于音频和声音的播放、录制、混音、效果和 3D 音频处理(例如虚拟现实或游戏中的空间音频)。

主要功能: #

  • 音频播放:
    • 播放音频文件或音频流。
  • 音频录制:
    • 从设备(如麦克风)捕获音频。
  • 音频处理:
    • 添加音频效果(如混响、均衡器)。
    • 分析音频数据(如波形或频谱分析)。
  • 音频会话管理:
    • 设置音频会话(用 AVAudioSession 设置 App 的音频环境,如后台播放)。
  • 3D 音频播放:
    • 定义音源的位置,模拟生活中音源与听者的空间关系。
  • 混音与多轨音频:
    • 使用 AVAudioEngine 来处理音频节点(如音频混音、音效处理)。

常用类: #

  • AVAudioPlayer 播放音频文件(轻量级播放器)。
  • AVAudioRecorder 录制音频。
  • AVAudioEngine 用于构建音频处理图表,例如多轨混音、添加音效等。
  • AVAudioSession 管理和配置音频会话(如后台播放模式、麦克风设置等)。
  • AVAudioFile 插入或分析音频文件数据。
  • AVAudioUnitAudioNodes:处理音频信号,比如加入混响、滤波等音效,或自定义效果。

适用场景: #

  • 创建音频播放器(如单纯的背景音乐播放器)。
  • 录制音频(如实现语音备忘录功能)。
  • 简单处理音频效果(如变速播放、添加混响)。
  • 实现复杂音频图(如编写音频合成工具,控制多声道音频)。

功能应用对比 #

功能AVFoundationAVFAudio
多媒体支持包含音频和视频专注于音频
播放播放音视频流(AVPlayerAVPlayerItem播放本地音频文件(AVAudioPlayer
录制支持音频和视频录制(如用摄像头、麦克风录制视频)专注于音频录制(AVAudioRecorder
音频处理视频和音频同步处理专注于音频效果(如混音、变速、多轨编辑、音频图)
媒体元数据支持强大的媒体元数据功能(音频和视频)未直接支持元数据
工作模式能同时处理音频、视频以及两者混合的数据完全围绕音频功能
高级/低级控制高层次的 API,更适合简单的、多媒体综合应用场景更低级和细粒度的音频控制,例如音频会话、混音等
主要场景视频播放系统、多媒体内容管理、视频录制/编辑器音频引擎、背景音乐播放器、语音录制或实时音效处理

3. 设计上的分工 #

AVFAudio 被分离出来是为了让开发者能够更加专注于音频功能,而 AVFoundation 提供的是更高层的综合多媒体功能。

开发者可以单独使用 AVFAudio 实现音频应用,而无需使用完整的 AVFoundation。但当你需要同时处理视频和音频时,就需要使用 AVFoundation,其中 AVFAudio 负责完成音频相关的处理。


4. 示例代码比较 #

使用 AVFoundation 播放音视频文件 #

import AVFoundation

class ViewController: UIViewController {
    var player: AVPlayer? // 视频/音频播放器

    override func viewDidLoad() {
        super.viewDidLoad()
        // 初始化播放器并播放视频
        if let videoURL = URL(string: "https://example.com/video.mp4") {
            player = AVPlayer(url: videoURL)
            player?.play() // 开始播放
        }
    }
}

使用 AVFAudio 播放音频文件 #

import AVFAudio

class ViewController: UIViewController {
    var audioPlayer: AVAudioPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 播放音频文件
        if let audioURL = Bundle.main.url(forResource: "example", withExtension: "mp3") {
            do {
                audioPlayer = try AVAudioPlayer(contentsOf: audioURL)
                audioPlayer?.play() // 开始播放音频
            } catch {
                print("Error playing audio: \(error)")
            }
        }
    }
}

5. 总结 #

  • AVFoundation 是一个全面的多媒体框架,支持音频、视频和流媒体处理。
    • 适合开发播放器、多媒体编辑器、元数据管理、音视频同步等更高层次的多媒体应用。
  • AVFAudioAVFoundation 的子框架,专注于音频处理。
    • 适合开发专注音频的应用,例如音乐播放器、录音、音效生成器、3D 空间音频等。

二者是从 功能范围 上做了划分,但属于同一个生态系统。如果你的项目只涉及音频功能,AVFAudio 已经足够;而如果涉及音视频的综合处理,就要使用 AVFoundation

本文共 2073 字,上次修改于 Dec 30, 2024