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() |