[스위프트 기초] 13장 (2) 오디오 재생 및 녹음

    
    
    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController, AVAudioPlayerDelegate, AVAudioRecorderDelegate {
        
        var audioPlayer : AVAudioPlayer!
        var audioFile : URL!
        let MAX_VOLUME : Float = 10.0
        var progressTimer : Timer!
        
        let timePlayerSelector: Selector = #selector(ViewController.updatePlayTime)
    
        @IBOutlet var pvProgressPlay: UIProgressView!
        @IBOutlet var lblCurrentTime: UILabel!
        @IBOutlet var lblEndTime: UILabel!
        @IBOutlet var btnPlay: UIButton!
        @IBOutlet var btnPause: UIButton!
        @IBOutlet var slVolume: UISlider!
        @IBOutlet var btnStop: UIButton!
        
        //recording
        @IBOutlet var btnRecord: UIButton!
        @IBOutlet var lblRecordTime: UILabel!
        
        var audioRecorder : AVAudioRecorder!
        var isRecordMode = false
        
        let timeRecordSelector:Selector = #selector(ViewController.updateRecordTime)
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            selectAudioFile()
            if !isRecordMode{
                initPlay()
                btnRecord.isEnabled = false
                lblRecordTime.isEnabled = false
            }
            else{
                initRecord()
            }
        }
        
        //make record file
        func selectAudioFile(){
            if !isRecordMode{
                audioFile = Bundle.main.url(forResource: "test", withExtension: "mp3")
            }
            else {
                let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
                audioFile = documentDirectory.appendingPathComponent("recordFile.m4a")
            }
        }
        //녹음 init
        func initRecord(){
            let recordSetting = [
            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: recordSetting)
            }
            catch let error as NSError {
                print ("Error-initRecord : \(error)")
            }
            
            audioRecorder.delegate = self
            
            slVolume.value = 1.0
            audioPlayer.volume = slVolume.value
            lblEndTime.text = convertNSTimeInterval2String(0)
            lblCurrentTime.text = convertNSTimeInterval2String(0)
            setPlayButtons(false, pause: false, stop: false)
            
            let session = AVAudioSession.sharedInstance()
            do {
                try AVAudioSession.sharedInstance().setCategory(.playAndRecord, 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)")
            }
        }
        
        
        func initPlay() {
            do{
                audioPlayer = try AVAudioPlayer(contentsOf: audioFile)
            }
            catch let error as NSError {
                print ("Error-initPlay : \(error)")
            }
            slVolume.maximumValue = MAX_VOLUME
            slVolume.value = 1.0
            pvProgressPlay.progress = 0
            
            audioPlayer.delegate = self
            audioPlayer.prepareToPlay()
            audioPlayer.volume = slVolume.value
            
            // 재생시간 초기화
            lblEndTime.text = convertNSTimeInterval2String(audioPlayer.duration)
            lblCurrentTime.text = convertNSTimeInterval2String(0)
            
            //오디오 버튼 제어
            setPlayButtons(true, pause: false, stop: false)
        }
        //버튼 여부 설정
        func setPlayButtons(_ play:Bool, pause:Bool, stop:Bool){
            btnPlay.isEnabled = play
            btnPause.isEnabled = pause
            btnStop.isEnabled = stop
        }
        func convertNSTimeInterval2String(_ time: TimeInterval) -> String {
            let min = Int(time/60)
            let sec = Int(time.truncatingRemainder(dividingBy: 60))
            let strTime = String(format: "%02d:%02d",min,sec)  // 시간 String 으로 바꿔줌
            return strTime
        }
        @IBAction func btnPlayAudio(_ sender: UIButton) {
            audioPlayer.play()
            setPlayButtons(false, pause: true, stop: true)
            
            //timer setting
            progressTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: timePlayerSelector, userInfo: nil, repeats: true)
        }
        @objc func updatePlayTime() {
            lblCurrentTime.text = convertNSTimeInterval2String(audioPlayer.currentTime)
            pvProgressPlay.progress = Float(audioPlayer.currentTime/audioPlayer.duration)
        }
        @IBAction func btnPauseAudio(_ sender: UIButton) {
            audioPlayer.pause()
            setPlayButtons(true, pause: false, stop: true)
        }
        @IBAction func btnStopAudio(_ sender: UIButton) {
            audioPlayer.stop()
            audioPlayer.currentTime = 0
            lblCurrentTime.text = convertNSTimeInterval2String(0)
            setPlayButtons(true, pause: false, stop: false)
            progressTimer.invalidate()  //무효화
        }
        @IBAction func slChangeVolume(_ sender: UISlider) {
            audioPlayer.volume = slVolume.value
        }
        func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
            progressTimer.invalidate()
            setPlayButtons(true, pause: false, stop: false)
        }
        
        @IBAction func swRecordMode(_ sender: UISwitch) {
            if sender.isOn {
                audioPlayer.stop()
                audioPlayer.currentTime = 0
                lblRecordTime.text = convertNSTimeInterval2String(0)
                isRecordMode =  true
                btnRecord.isEnabled = true
                lblRecordTime.isEnabled = true
            }
            else {
                isRecordMode =  false
                btnRecord.isEnabled = false
                lblRecordTime.isEnabled = false
                lblRecordTime.text = convertNSTimeInterval2String(0)
            }
            
            selectAudioFile()
            
            if !isRecordMode {
                initPlay()
            }
            else {
                initRecord()
            }
        }
        @IBAction func btnRecord(_ sender: UIButton) {
            if (sender as AnyObject).titleLabel?.text == "Record" {
                audioRecorder.record()
                (sender as AnyObject).setTitle("Stop", for: UIControl.State())
                progressTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: timeRecordSelector, userInfo: nil, repeats: true)
            }
            else{
                audioRecorder.stop()
                progressTimer.invalidate()
                (sender as AnyObject).setTitle("Record", for: UIControl.State())
                btnPlay.isEnabled = true
                initPlay()
            }
        }
        @objc func updateRecordTime () {
            lblRecordTime.text = convertNSTimeInterval2String(audioRecorder.currentTime)
        }
        
    }

    'Study > Swift' 카테고리의 다른 글

    [swift 문법] 함수 기본 ~ 조건문  (0) 2025.01.08
    [swift 문법] 1단원 스위프트 기초  (0) 2025.01.07
    [스위프트 기초] 13장 오디오  (0) 2025.01.02
    do - try - catch 문  (0) 2025.01.02
    [스위프트 기초] 자동 레이아웃  (1) 2024.12.27

    댓글