【问题标题】:What is correct usage of AVAudioRecorder in Cocoa (macOS)?可可(macOS)中 AVAudioRecorder 的正确用法是什么?
【发布时间】:2021-06-25 18:11:26
【问题描述】:

我有一个simple app,我尝试在 macOS 上使用 Swift 和 Cocoa 进行录音。我得到了一个音频文件,但里面没有 nothing。整个应用程序基本上都在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()

【问题讨论】:

  • 您的Info.plist 设置是否正确并请求记录权限? developer.apple.com/documentation/avfoundation/…
  • 您的 info.plist 中有麦克风使用隐私吗?
  • @ElTomato 哦,不要读得太字面意思。这只是一种说法,我将所有代码放在 NSWindowController 子类中,而不是将其分解到模型对象和其他控制器中。
  • @jnpdx 谢谢!这解决了问题。

标签: swift cocoa avaudiorecorder


【解决方案1】:

您需要将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 在评论中澄清这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    相关资源
    最近更新 更多