Запись аудио на OSX (AVAudioSession недоступен) - PullRequest
2 голосов
/ 28 мая 2019

Я хочу записать звук на OSX. У меня есть IOS, работающая с AVAudioSession, но, поскольку она не поддерживается в OSX, мне трудно найти простой пример для OSX для записи звука в файл для последующего воспроизведения.

Все примеры, которые я нахожу на stackoverflow, были IOS, а не Swift.

Любая помощь здесь будет оценена Ссылка на простой пример кода захвата звука на основе OSX Swift была бы отличной.

Спасибо, Том

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

API Audio Queue работает для записи на iOS и MacOS (OSX). Так что ищите пример Audio Queue; на github их несколько.

0 голосов
/ 28 мая 2019

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
        }
    }
}
...