AVAudioRecorder 是 Apple 提供的一个用于 音频录制 的类,属于 AVFoundation 框架的一部分。它用于通过设备的麦克风录制音频,并保存为文件(支持多种音频格式)。以下是对 AVAudioRecorder 的功能介绍、使用指南、代码示例以及注意事项的详细说明。
1. AVAudioRecorder 的功能#
AVAudioRecorder 提供了以下主要功能:
- 录制音频
- 支持设备麦克风捕获音频,并保存到本地文件。
- 暂停/继续录制
- 支持在录音过程中暂停和继续。
- 设置录制格式
- 支持多种音频格式,如
.wav,.aac,.m4a等,并允许自定义音频配置参数(如采样率、位深度、声道数量等)。
- 支持多种音频格式,如
- 音频峰值和平均电平
- 可以实时监控录制时的音频输入电平。
- 监听录制完成或中断
- 提供回调方法,以检测录音完成或被中断。
2. 使用 AVAudioRecorder 的基本步骤#
2.1 准备使用 AVAudioRecorder#
在录音之前,你必须进行一些必需的配置:
- 获取麦克风权限
- 使用
AVAudioSession请求麦克风权限。
- 使用
- 设置音频录制路径
- 确保录音的文件路径和格式合适。
- 配置录音参数
- 包括音频格式、采样率、声道数等。
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 获取音频电平(以显示波形或音强指示器)#
在录制音频时,可以获取当前音频信号的电平(峰值和平均值):
- 先调用
audioRecorder?.updateMeters()更新音频数据。 - 再通过
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 | 值类型 | 描述 |
|---|---|---|
AVFormatIDKey | UInt32 | 音频编码格式(如 kAudioFormatMPEG4AAC, kAudioFormatLinearPCM)。 |
AVSampleRateKey | Float64 | 采样率,以赫兹为单位(如 44100.0)。 |
AVNumberOfChannelsKey | Int | 声道数(如单声道:1,立体声:2)。 |
AVEncoderAudioQualityKey | Int | 编码质量(低、中、高,使用 AVAudioQuality 枚举)。 |
AVLinearPCMBitDepthKey | Int | 位深度(如 16 或 32)。 |
常用编码格式:#
kAudioFormatMPEG4AAC:常见的苹果音频格式,压缩比高,适合存储。kAudioFormatLinearPCM:原始 PCM 数据,占用空间大,无压缩。
5. 注意事项#
麦克风权限
- 在开始录音时务必请求麦克风权限,否则录音会失败。
- 在
Info.plist中增加NSMicrophoneUsageDescription,并提供权限说明:<key>NSMicrophoneUsageDescription</key> <string>App requires access to the microphone for recording audio.</string>
设备支持
- 不同设备支持的音频采样率和格式可能不同,确保录制设置与设备兼容。
- 可调用
AVAudioSession的availableInputs来检查是否有可用的麦克风。
录音过程中监听中断
- 需要监听系统中断事件(如来电、Siri 激活等),在适当时候暂停或恢复录音:
NotificationCenter.default.addObserver( self, selector: #selector(handleInterruption), name: AVAudioSession.interruptionNotification, object: nil )
- 需要监听系统中断事件(如来电、Siri 激活等),在适当时候暂停或恢复录音:
文件路径
- 确保文件路径写入正确,否则录音文件无法保存。
6. 适用场景#
- 语音笔记
- 用户点击录制按钮开始录制,点击停止按钮结束录制。
- 音频输入分析
- 获取音频电平信息,显示波形或创建音频可视化。
- 多媒体应用
- 开发录音功能的媒体应用,例如播客录制工具、声音记录器等。
7. 总结#
AVAudioRecorder 是一款强大的音频录制工具,适用于麦克风音频的录制存储。它的功能简单但足够实用,尤其适合实现基础录音需求。
| 功能 | 实现方式 |
|---|---|
| 开始录音 | audioRecorder?.record() |
| 停止录音 | audioRecorder?.stop() |
| 暂停录音 | audioRecorder?.pause() |
| 检测录音状态 | audioRecorder?.isRecording |
| 实时音量监测 | 开启 isMeteringEnabled 并调用 updateMeters() |