AVAudioEngine은 AVFoundation에서 제공하는 포함된 객체이며 실시간 오디오 처리를 가능하게 하며, 오디오 입력, 출력 그리고 오디오 신호를 실시간으로 변화하거나 조작하는 객체입니다.

.mp4, .wav, .caf 같은 오디오 파일을 앱에서 불러와 오디오 소스를 준비하고 처리를 시작하기 위한 제어와 관리를 수행합니다.// 이 파일이 Player Node로 전달됩니다.
if let fileURL = Bundle.main.url(forResource: "example", withExtension: "mp3") { let audioFile = try! AVAudioFile(forReading: fileURL)
}
AVAudioEngine내에서 오디오 데이터를 실시간으로 처리하기 위한 구간입니다. AVAudioPlayerNode, AVAudioMixerNode 등을 attach, detach 할 수 있습니다.AVAudioOutputNode를 통해서 오디오를 데이터를 출력할 수 있습니다.let audioEngine = AVAudioEngine()
let playerNode = AVAudioPlayerNode()
audioEngine.attach(playerNode)
let mixerNode = audioEngine.mainMixerNode
audioEngine.connect(playerNode, to: mixerNode, format: nil)
AVInputNode는 AVAudioEngine에 일부로, 마이크와 같은 입력 장치에서 실시간으로 오디오 데이터를 스트리밍하고, 이를 다른 오디오 노드로 전달 합니다.AVInputNode는 AVAudioNode Class를 상속 받고 있기 때문에 AVAudioNode에서 제공되는 메서드, 속성 값을 사용할 수 있습니다.installTap(onBus:bufferSize:format:block:) 메서드가 있습니다.버스란(Bus)?
오디오 노드가 데이터를 입력하거나 출력하는 경로입니다. 기본적으로 각 노드는 1개의 버스를 가지지만, 일부 노드는 여러 개의 버스를 가질 수 있습니다.
버스에 오디오 탭을 설치하여 오디오 출력을 기록, 모니터링을 감지합니다. let engine = AVAudioEngine()
let inputNode = engine.inputNode
let format = inputNode.inputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: format) { (buffer, time) in
// 버스에서 실시간으로 전달되는 오디오 데이터
print("오디오 데이터: \(buffer)")
}
try? engine.start()