Cocoa(macOS)中AVAudioRecorder正确用法:生成录音文件无内容如何解决
问题原因
- 未主动申请麦克风权限:macOS 10.14及以上版本对麦克风权限做了严格限制,GUI应用必须先显式向用户申请麦克风使用权限,未获得授权时AVAudioRecorder会静默录制空音频,不会抛出任何错误提示。Playground运行时会自动触发权限申请流程,因此相同代码可以正常运行。
- 缺少Info.plist权限声明:即使写了权限申请逻辑,如果没有在项目Info.plist中添加
NSMicrophoneUsageDescription(麦克风使用权限描述)键,填入向用户说明录音用途的文案,系统会直接拒绝权限申请。 - 录音调用时机错误:权限申请是异步操作,你当前的代码没有等待权限授权结果返回就直接启动录音,大概率是权限还没申请完成就已经开始录制,最终生成空白文件。
正确实现步骤
- 首先打开项目Info.plist,右键选择「Add Row」,添加
NSMicrophoneUsageDescription项,Value栏填写如「需要使用麦克风录制音频」的说明文案。 - 调整录音逻辑,先申请权限,拿到授权后再启动录音,示例代码如下:
import AVFoundation var recorder : AVAudioRecorder? // 替换为你实际的音频存储路径 let filename = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("voiceRec.m4a") func startRecording() { // 先请求麦克风权限 AVCaptureDevice.requestAccess(for: .audio) { [weak self] granted in guard granted else { print("用户拒绝了麦克风权限,无法录音") return } // 权限申请通过,在主线程执行录音逻辑 DispatchQueue.main.async { do { let settings = [ AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 12000, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue ] guard let filename = self?.filename else { return } let rec = try AVAudioRecorder(url: filename, settings: settings) rec.delegate = self rec.prepareToRecord() rec.isMeteringEnabled = true rec.record() self?.recorder = rec } catch { print("录音初始化失败:\(error.localizedDescription)") } } } } @IBAction func stop(sender: AnyObject) { self.recorder?.stop() self.recorder = nil }
- 确认Signing & Capabilities中已经勾选「Audio Input」选项,你当前的配置这一项是正确的,不需要调整。
按上述步骤调整后即可正常生成有内容的录音文件。
内容的提问来源于stack exchange,提问作者Erik Engheim
相关产品推荐
相关产品推荐

