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

What is correct usage of AVAudioRecorder in Cocoa (macOS)?

我有一个 simple app,我尝试使用 Swift 和 Cocoa 在 macOS 上进行录音。我生成了一个音频文件,但其中没有 。整个app基本上在一个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
}

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

奇怪的是我在 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),
    AVSampleRateKey: 12000,
    AVNumberOfChannelsKey: 1,
    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()

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

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

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

您可以查看 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 在评论中澄清了这一点。