在 OSX 上录制音频(AVAudioSession 不可用)

Record Audio on OSX (AVAudioSession not available)

我想在 OSX 上捕捉音频。我 IOS 使用 AVAudioSession,但由于 OSX 不支持它,我很难在 OSX 上找到一个简单的示例来将音频录制到文件以供后续播放。

我在 Whosebug 上找到的所有示例都是 IOS 和/或不在 Swift。

如有任何帮助,我们将不胜感激。基于 link 到 OSX Swift 的简单音频捕获示例代码会很棒。

谢谢汤姆

AVAudioSession 用于管理 iOS 音频约束。这些限制在 macOS 上不存在,因此您不需要 AVAudioSession。万岁!

您可以使用 AVAudioEngineAVAudioFile 将音频捕获到文件中:

import Cocoa
import AVFoundation

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!

    let audioEngine = AVAudioEngine()
    var outputFile: AVAudioFile? = nil

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // If sandboxed, don't forget to turn on Microphone in Capabilities > App Sandbox
        let input = audioEngine.inputNode
        let bus = 0
        let inputFormat = input.inputFormat(forBus: bus)

        let outputURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("out.caf")
        print("writing to \(outputURL)")

        outputFile = try! AVAudioFile(forWriting: outputURL, settings: inputFormat.settings, commonFormat: inputFormat.commonFormat, interleaved: inputFormat.isInterleaved)

        input.installTap(onBus: bus, bufferSize: 512, format: inputFormat) { (buffer, time) in
            try! self.outputFile?.write(from: buffer)
        }

        try! audioEngine.start()

        DispatchQueue.main.asyncAfter(deadline: .now()+5) {
            print("Finish")
            self.audioEngine.stop()
            self.outputFile = nil
        }
    }
}

音频队列 API 适用于在 iOS 和 macOS (OSX) 上进行录音。所以寻找一个音频队列示例; github.

上似乎有几个

要使@Rhythmic Fistman 的代码在 macOS 10.15+ 中运行,请确保将 Privacy - Microphone Usage Description 键和值添加到应用程序的 Info.plist