Foundation — AVAudioRecorder

AVAudioRecorder 是 Apple 提供的一个用于 音频录制 的类,属于 AVFoundation 框架的一部分。它用于通过设备的麦克风录制音频,并保存为文件(支持多种音频格式)。以下是对 AVAudioRecorder 的功能介绍、使用指南、代码示例以及注意事项的详细说明。


1. AVAudioRecorder 的功能 #

AVAudioRecorder 提供了以下主要功能:

  1. 录制音频
    • 支持设备麦克风捕获音频,并保存到本地文件。
  2. 暂停/继续录制
    • 支持在录音过程中暂停和继续。
  3. 设置录制格式
    • 支持多种音频格式,如 .wav, .aac, .m4a 等,并允许自定义音频配置参数(如采样率、位深度、声道数量等)。
  4. 音频峰值和平均电平
    • 可以实时监控录制时的音频输入电平。
  5. 监听录制完成或中断
    • 提供回调方法,以检测录音完成或被中断。

2. 使用 AVAudioRecorder 的基本步骤 #

2.1 准备使用 AVAudioRecorder #

在录音之前,你必须进行一些必需的配置:

  1. 获取麦克风权限
    • 使用 AVAudioSession 请求麦克风权限。
  2. 设置音频录制路径
    • 确保录音的文件路径和格式合适。
  3. 配置录音参数
    • 包括音频格式、采样率、声道数等。

2.2 基本类和方法 #

类/方法说明
AVAudioRecorder录音类,负责音频录制。
AVAudioSession配置音频环境(如是否允许录音/播放)。
prepareToRecord()准备录音(预加载资源)。
record()开始录音。
pause()暂停录音,可以稍后恢复。
stop()停止录音。
isRecording查询当前是否正在录音。
updateMeters()更新音频电平数据。
peakPower(forChannel:)获取音频峰值电平(实时)。
averagePower(forChannel:)获取音频平均电平(实时)。

3. 代码示例 #

以下是一个完整的录音功能的实现,包括如何请求权限、配置录音参数和使用录音器录制音频。

3.1 基础录音示例 #

import AVFoundation

class AudioRecorderExample {
    var audioRecorder: AVAudioRecorder?

    func startRecording() {
        // 1. 请求麦克风权限
        AVAudioSession.sharedInstance().requestRecordPermission { granted in
            if granted {
                // 权限被授予,开始录制
                self.setupAndStartRecording()
            } else {
                print("Microphone permission denied.")
            }
        }
    }

    private func setupAndStartRecording() {
        do {
            // 2. 配置音频会话
            let audioSession = AVAudioSession.sharedInstance()
            try audioSession.setCategory(.playAndRecord, mode: .default, options: .defaultToSpeaker)
            try audioSession.setActive(true)

            // 3. 设置录音文件路径
            let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
            let audioFileURL = documentsDirectory.appendingPathComponent("recording.m4a")

            // 4. 配置录音设置
            let settings: [String: Any] = [
                AVFormatIDKey: kAudioFormatMPEG4AAC, // 编码格式
                AVSampleRateKey: 44100.0,           // 采样率(Hz)
                AVNumberOfChannelsKey: 2,           // 声道数
                AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue // 音频质量
            ]

            // 5. 初始化录音器
            audioRecorder = try AVAudioRecorder(url: audioFileURL, settings: settings)
            audioRecorder?.prepareToRecord() // 准备录音
            audioRecorder?.record()          // 开始录音
            print("Recording started. File saved to: \(audioFileURL)")
        } catch {
            print("Failed to set up audio recorder: \(error.localizedDescription)")
        }
    }

    func stopRecording() {
        audioRecorder?.stop() // 停止录音
        audioRecorder = nil
        print("Recording stopped.")
    }
}

3.2 使用 pause()resume() 暂停与继续录音 #

示例代码: #

func pauseRecording() {
    if audioRecorder?.isRecording == true {
        audioRecorder?.pause()
        print("Recording paused.")
    }
}

func resumeRecording() {
    if let recorder = audioRecorder, !recorder.isRecording {
        recorder.record()
        print("Recording resumed.")
    }
}

3.3 获取音频电平(以显示波形或音强指示器) #

在录制音频时,可以获取当前音频信号的电平(峰值和平均值):

  1. 先调用 audioRecorder?.updateMeters() 更新音频数据。
  2. 再通过 averagePower(forChannel:)peakPower(forChannel:) 获取数据。

示例代码: #

func monitorAudioLevels() {
    guard let recorder = audioRecorder else { return }

    recorder.isMeteringEnabled = true // 开启音频电平监测
    recorder.updateMeters()           // 更新音频数据

    let averagePower = recorder.averagePower(forChannel: 0) // 平均电平
    let peakPower = recorder.peakPower(forChannel: 0)       // 峰值电平
    print("Average Power: \(averagePower), Peak Power: \(peakPower)")
}

4. AVAudioRecorder 的设置参数 #

在初始化 AVAudioRecorder 时,可以通过 settings 字典指定以下参数:

Key值类型描述
AVFormatIDKeyUInt32音频编码格式(如 kAudioFormatMPEG4AAC, kAudioFormatLinearPCM)。
AVSampleRateKeyFloat64采样率,以赫兹为单位(如 44100.0)。
AVNumberOfChannelsKeyInt声道数(如单声道:1,立体声:2)。
AVEncoderAudioQualityKeyInt编码质量(低、中、高,使用 AVAudioQuality 枚举)。
AVLinearPCMBitDepthKeyInt位深度(如 16 或 32)。

常用编码格式: #

  • kAudioFormatMPEG4AAC:常见的苹果音频格式,压缩比高,适合存储。
  • kAudioFormatLinearPCM:原始 PCM 数据,占用空间大,无压缩。

5. 注意事项 #

  1. 麦克风权限

    • 在开始录音时务必请求麦克风权限,否则录音会失败。
    • Info.plist 中增加 NSMicrophoneUsageDescription,并提供权限说明:
      <key>NSMicrophoneUsageDescription</key>
      <string>App requires access to the microphone for recording audio.</string>
      
  2. 设备支持

    • 不同设备支持的音频采样率和格式可能不同,确保录制设置与设备兼容。
    • 可调用 AVAudioSessionavailableInputs 来检查是否有可用的麦克风。
  3. 录音过程中监听中断

    • 需要监听系统中断事件(如来电、Siri 激活等),在适当时候暂停或恢复录音:
      NotificationCenter.default.addObserver(
          self,
          selector: #selector(handleInterruption),
          name: AVAudioSession.interruptionNotification,
          object: nil
      )
      
  4. 文件路径

    • 确保文件路径写入正确,否则录音文件无法保存。

6. 适用场景 #

  1. 语音笔记
    • 用户点击录制按钮开始录制,点击停止按钮结束录制。
  2. 音频输入分析
    • 获取音频电平信息,显示波形或创建音频可视化。
  3. 多媒体应用
    • 开发录音功能的媒体应用,例如播客录制工具、声音记录器等。

7. 总结 #

AVAudioRecorder 是一款强大的音频录制工具,适用于麦克风音频的录制存储。它的功能简单但足够实用,尤其适合实现基础录音需求。


功能实现方式
开始录音audioRecorder?.record()
停止录音audioRecorder?.stop()
暂停录音audioRecorder?.pause()
检测录音状态audioRecorder?.isRecording
实时音量监测开启 isMeteringEnabled 并调用 updateMeters()
本文共 1582 字,上次修改于 Jan 1, 2025