AVPlayer, AVAudioPlayer, AVAudioEngine, AVAudioSession

간단정리 

  • AVAudioSession : 기기의 오디오 장치를 어떤것을 사용할 것인지를 정의.
  • AVPlayer : URL로 오디오 파일/ 영상 파일을 url이 있다면 url을 이용해서 재생할 수 있습니다. AVPlayer 자체는 영상을 재생하는 기능은 없지만, AVKit 또는 AVPlayerLayer를 이용하여 영상을 재생 시킬수있습니다.
  • AVAudioPlayer : 로컬 파일로 저장된 오디오 파일을 재생시킵니다. 단순히 재생, 일시정지만 가능하고, 재생 위치이동, 음의 pitch, 재생 속도등을 제어하려면 AVAudioEngine을 사용해야합니다.
  • AVAudioEngine : AVAudioPlayer과 마찬가지로 로컬파일로 저장된 오디오 파일을 재생합니다. 음의 pitch, 재생 위치, 재생 속도 등등을 제어 할 수 있습니다.

AVAudioEngine(이하 엔진)은 로컬 오디오 파일을 재생하는 player node, 재생중인 음원을  리얼타임으로 제어하는 Mixer node, 그리고 출력을 담당하는 output node로 이루어져있습니다. 또한 node를 연결하여 본인이 원하는 제어를 할 수 있습니다.

private let audioEngine = AVAudioEngine()
private let playerNode = AVAudioPlayerNode()
private var pitchControl = AVAudioUnitTimePitch()

audioEngine.attach(playerNode)
audioEngine.attach(pitchControl)
        
audioEngine.connect(playerNode, to: pitchControl, format: format)
audioEngine.connect(pitchControl, to: audioEngine.mainMixerNode, format: format)
        
self.audioEngine.prepare()
do{
	try audioEngine.start()
	setScheduleFile()
}catch{
	print("AUDIO ENGINE START ERROR")
}

이런식으로 AVAudioEngine을 본인이 원하는 노드를 더해서 작동시키면 됩니다. 오디오 파일을 재생시키려면 playerNode에 오디오 파일을 넣어서 play를 하면 됩니다.

func setAudioFile(){
        let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
            .appendingPathComponent("myRecoding.m4a")
        guard let file = try? AVAudioFile(forReading: fileURL) else {return}
        self.format = file.processingFormat
        self.audioFile = file
    }

playNode에 오디오 파일을 넣는 방법은 scheduleFile, scheduleSegment등이 있습니다. FileManager로 파일을 가져와 실행을 시키기 때문에 scheduleFile()로 예약을 해서 넣습니다. 

func setScheduleFile(){
        guard let file = audioFile else {return}
        playerNode.scheduleFile(file, at: nil, completionCallbackType: .dataPlayedBack)
    }

그리고 이제 play()를 누르면 재생이 됩니다.

playerNode.play()