【问题标题】:Record Audio on OSX (AVAudioSession not available)在 OSX 上录制音频(AVAudioSession 不可用)
【发布时间】:2019-05-28 01:12:51
【问题描述】:
我希望在 OSX 上捕获音频。我有 IOS 使用 AVAudioSession,但由于 OSX 不支持它,我很难在 OSX 上找到一个简单的示例来将音频录制到文件中以供后续播放。
我在 stackoverflow 上找到的所有示例都是 IOS 或不是 Swift。
我们将不胜感激。一个指向基于 OSX Swift 的简单音频捕获示例代码的链接会很棒。
谢谢汤姆
【问题讨论】:
标签:
swift
macos
core-audio
avaudiosession
【解决方案1】:
AVAudioSession 用于管理 iOS 音频约束。这些约束在 macOS 上不存在,因此您不需要 AVAudioSession。万岁!
您可以使用AVAudioEngine 和AVAudioFile 将音频捕获到文件中:
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
}
}
}
【解决方案2】:
音频队列 API 适用于 iOS 和 macOS (OSX) 上的录制。所以找一个音频队列的例子; github上好像有好几个。
【解决方案3】:
要让@Rhythmic Fistman 的代码在 macOS 10.15+ 中运行,请确保将 Privacy - Microphone Usage Description 键和值添加到应用的 Info.plist 中