[UIKit] AVAudioEngine 이란?

Jenny·2025년 1월 23일

AVAudioEngine

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

App

  • App 영역에서는 .mp4, .wav, .caf 같은 오디오 파일을 앱에서 불러와 오디오 소스를 준비하고 처리를 시작하기 위한 제어와 관리를 수행합니다.
// 이 파일이 Player Node로 전달됩니다. 
if let fileURL = Bundle.main.url(forResource: "example", withExtension: "mp3") { let audioFile = try! AVAudioFile(forReading: fileURL) 
}

Real time context

  • Real time context영역은 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

  • AVInputNodeAVAudioEngine에 일부로, 마이크와 같은 입력 장치에서 실시간으로 오디오 데이터를 스트리밍하고, 이를 다른 오디오 노드로 전달 합니다.
  • AVInputNodeAVAudioNode Class를 상속 받고 있기 때문에 AVAudioNode에서 제공되는 메서드, 속성 값을 사용할 수 있습니다.
  • 대표적으로는 installTap(onBus:bufferSize:format:block:) 메서드가 있습니다.

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()
profile
"Jenny 있게 iOS 개발을 하며 대체 불가능한 인재가 되자"

0개의 댓글