본문 바로가기

iOS/스위프트로 아이폰 앱 만들기

[13장] Audio

728x90

아이폰에서 노래를 재생하거나 소리를 녹음하는 것과 같이 소리와 관련된 동작이 많이 있습니다.

 

오디오 사용을 위한 준비

AVFoundation을 추가하고, AVAudioPlayerDelegate를 상속받습니다.

그리고 오디오 파일로 AVAudioPlayer를 생성합니다.

import AVFoundation

class ViewController: UIViewController, AVAudioPlayerDelegate {
	
    var audioPlayer: AVAudioPlayer!
    var audioFile: URL!
    
	override func viewDidLoad() {
    	super.viewDidLoad()
    	audioFile = Bundle.main.url(forResource: "Sicilian_Breeze", withExtension: "mp3")
        initPlay()
    }
    
    func initPlay() {
    	do {
        	audioPlayer = try AVAudioPlayer(contentsOf: audioFile)
        } catch let error as NSError {
        	print("Error-initPlay : \(errer)")
        }
        audioPlayer.delegate = self
        audioPlayer.prepareToPlay()
        audioPlayer.volume = 1.0	// 0.0 ~ 1.0
    }
}

 

오디오 플레이어 조작

play, pause, stop으로 오디오 플레이어의 동작을 제어할 수 있습니다.

audioPlayer.play()
audioPlayer.pause()
audioPlayer.stop()

 

녹음을 위한 준비

녹음을 위해서는 AVAudioRecorderDelegate를 상속하고 AVAudioRecoder 인스턴스를 이용합니다.

class ViewController: UIViewController, AVAudioPlayerDelegate, AVAudioRecorderDelegate {
	var audioRecorder: AVAudioRecorder!
}

 

녹음한 파일을 위치를 지정해야 합니다.

let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
audioFile = documentDirectory.appendingPathComponent("recordFile.m4a")

 

녹음하기

녹음하기 위한 설정값과 함께 AvAudioRecorder 인스턴스를 생성합니다.

    func initRecord() {
        let recordSettings = [
            AVFormatIDKey: NSNumber(value: kAudioFormatAppleLossless as UInt32),
            AVEncoderAudioQualityKey: AVAudioQuality.max.rawValue,
            AVEncoderBitRateKey: 320000,
            AVNumberOfChannelsKey: 2,
            AVSampleRateKey: 44100.0] as [String: Any]
        do {
            audioRecorder = try AVAudioRecorder(url: audioFile, settings: recordSettings)
        } catch let error as NSError {
            print("Error-initRecord : \(error)")
        }
        audioRecorder.delegate = self

        let session = AVAudioSession.sharedInstance()
        do {
            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
            try AVAudioSession.sharedInstance().setActive(true)
        } catch let error as NSError {
            print(" Error-setCategory : \(error)")
        }
        do {
            try session.setActive(true)
        } catch let error as NSError {
            print(" Error-setActive : \(error)")
        }
    }

음악 재생은 앱이 백그라운드로 내려가더라도 재생될 경우가 있는데, 이와 같은 시스템과의 커뮤니케이션은 AVAudioSession을 통해서 처리할 수 있습니다.

 

Reference

https://developer.apple.com/documentation/avfoundation

https://developer.apple.com/documentation/avfaudio/avaudiosession

'iOS > 스위프트로 아이폰 앱 만들기' 카테고리의 다른 글

[15장] Camera & Photo Library  (0) 2021.10.19
[14장] Video  (0) 2021.10.19
[12장] Table View  (0) 2021.10.17
[11장] Navigation  (0) 2021.10.17
[10장] Tab bar  (0) 2021.10.17