Cocoa (macOS) 中 AVAudioRecorder 的正确用法是什么?

问题描述

我有一个 simple app,我尝试在 macOS 上使用 Swift 和 Cocoa 进行录音。我制作了一个音频文件,但其中什么都没有。整个应用程序基本上都在一个 NSWindowController 中。它有这个相关的代码

// member variable for recorder
var recorder : AVAudioRecorder?

// function called indirectly from UI to begin recording
func startRecording() throws {
    let settings = [
        AVFormatIDKey: Int(kAudioFormatMPEG4AAC),AVSampleRateKey: 12000,AVNumberOfChannelsKey: 1,AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
    ]
    
    let rec = try AVAudioRecorder(url: filename,settings: settings)
    rec.delegate = self
    rec.preparetoRecord()

    rec.isMeteringEnabled = true
    rec.record()
    self.recorder = rec
}

// Callback I use to stop recording
@IBAction func stop(sender: AnyObject) {
    self.recorder?.stop()
    self.recorder = nil
}
@H_502_9@

对于签名和功能,我检查了以下内容。我不确定我的代码是否有问题,或者我的功能是否有问题。

enter image description here

奇怪的是,我在 Playgrounds 中得到了这种风格的代码。此代码将在 Playgrounds 中工作,但它看起来与我的 GUI 应用程序代码没有根本的不同:​​

import Speech

let paths = FileManager.default.urls(
    for: .documentDirectory,in: .userDomainMask)
let docsDir = paths[0]
let filename = docsDir.appendingPathComponent("voiceRec.m4a")


let settings = [
    AVFormatIDKey: Int(kAudioFormatMPEG4AAC),AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]

let rec = try AVAudioRecorder(
    url: filename,settings: settings)
var ok = rec.preparetoRecord()

ok = rec.record()

// Evaluate this in playground when you are done recording
rec.stop()
@H_502_9@


解决方法

您需要将 NSMicrophoneUsageDescription 键添加到您的 Info.plist 文件中。这是允许访问麦克风所必需的。请记住,iOS 和 macOS 都在沙箱中运行,并且不会允许应用程序执行任何未获得明确许可的操作。 NSMicrophoneUsageDescription 必须描述麦克风的用途,以便应用程序的用户可以阅读给出的原因并判断它是否有效,或者该特定功能是否是他们想要使用的东西。

enter image description here

您只需粘贴密钥,如图所示。您需要点击上方一行的加号 (+) 按钮添加另一个条目。

还要确保在功能下启用麦克风输入:

enter image description here

您可以看到 Info.plist 的外观示例

<key>NSMicrophoneUsageDescription</key>
<string>Record audio to file to later transcribe</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>For transcribing recorded audio</string>

感谢@jnpdx 在评论中澄清这一点。