ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • swift 음악 재생 및 녹음 기능 만들기
    swift 2024. 11. 30. 14:45
    반응형
    //
    //  ViewController.swift
    //  Audio
    //
    //  Created by 인하준 on 11/30/24.
    //
    
    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController, AVAudioPlayerDelegate, AVAudioRecorderDelegate {
        
        // 인스턴스 변수
        var audioPlayer : AVAudioPlayer!
        
        // 재생할 오디오 파일명
        var audioFile : URL!
        
        // 최대 볼륨, 실수형 상수
        var MAX_VOLUM : Float = 10.0
        
        // 타이머를 위한 변수
        var progressTimer : Timer!
        
        let timePlayerSeleoter = #selector(ViewController.updatePlatTime)
        let timeRecordSelector: Selector = #selector(ViewController.updateRecordTime)
        
        @IBOutlet var pvProgressPlay: UIProgressView!
        
        @IBOutlet var libCrunntTime: UILabel!
        
        @IBOutlet var lblEndTime: UILabel!
        
        @IBOutlet var btnPlay: UIButton!
        
        @IBOutlet var btnPause: UIButton!
        
        @IBOutlet var btnStop: UIButton!
        
        @IBOutlet var slVolum: UISlider!
        
        @IBOutlet var btnRecord: UIButton!
        
        @IBOutlet var lblRecordTime: UILabel!
        
        var audioRecorder : AVAudioRecorder!
        var isRecordMede = false
        
        override func viewDidLoad() {
            super.viewDidLoad()
            selectAudioFile()
            // Do any additional setup after loading the view.
            if !isRecordMede {
                initPlay()
                btnRecord.isEnabled = false
                lblRecordTime.isHidden = false
            } else {
                initRecord()
            }
        }
        
        func selectAudioFile() {
            if !isRecordMede {
                audioFile = Bundle.main.url(forResource: "Sicilian_Breeze", withExtension: "mp3")
            } else {
                let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
                audioFile = documentDirectory.appendingPathComponent("recordFile.m4a")
            }
        }
        
        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("Erroe-inrecord: \(error)")
            }
            
            audioRecorder.delegate = self
            
            slVolum.value = 1.0
            audioPlayer.volume = slVolum.value
            lblEndTime.text = convertNSTimeInterval2String(0)
            libCrunntTime.text = convertNSTimeInterval2String(0)
            setPlayButton(false, puase: 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-detCategory: \(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)")
            }
            
            slVolum.maximumValue = MAX_VOLUM
            slVolum.value = 1.0
            pvProgressPlay.progress = 0
            
            audioPlayer.delegate = self
            audioPlayer.prepareToPlay()
            audioPlayer.volume = slVolum.value
            
            lblEndTime.text = convertNSTimeInterval2String(audioPlayer.duration)
            libCrunntTime.text = convertNSTimeInterval2String(0)
            
            setPlayButton(true, puase: false, stop: false)
        }
        
        func setPlayButton(_ play:Bool, puase:Bool, stop:Bool) {
            btnPlay.isEnabled = play
            
            btnPause.isEnabled = puase
            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)
            
            return strTime
        }
        
        @IBAction func btnPlayAudio(_ sender: UIButton) {
            audioPlayer.play()
            setPlayButton(false, puase: true, stop: true)
            progressTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: timePlayerSeleoter, userInfo: nil, repeats: true)
        }
        
        @objc func updatePlatTime() {
            libCrunntTime.text = convertNSTimeInterval2String(audioPlayer.currentTime)
            pvProgressPlay.progress = Float(audioPlayer.currentTime/audioPlayer.duration)
        }
        
        @IBAction func btnPauseAudio(_ sender: UIButton) {
            audioPlayer.pause()
            setPlayButton(true, puase: false, stop: true)
        }
        
        @IBAction func btnStopAudio(_ sender: UIButton) {
            audioPlayer.stop()
            audioPlayer.currentTime = 0
            libCrunntTime.text = convertNSTimeInterval2String(0)
            setPlayButton(true, puase: false, stop: false)
            progressTimer.invalidate()
        }
        
        @IBAction func slChangeVolum(_ sender: UISlider) {
            audioPlayer.volume = slVolum.value
        }
        
        func audioPlayerDidFinishPlaying(_ plyer: AVAudioPlayer, successFully flag: Bool) {
            progressTimer.invalidate()
            setPlayButton(true, puase: false, stop: false)
        }
        
        
        @IBAction func swRecordMode(_ sender: UISwitch) {
            if sender.isOn {
                audioPlayer.stop()
                audioPlayer.currentTime = 0
                lblRecordTime!.text = convertNSTimeInterval2String(0)
                isRecordMede = true
                btnRecord.isEnabled = true
                lblRecordTime.isEnabled = true
            } else {
                isRecordMede = false
                btnRecord.isEnabled = false
                lblRecordTime.isEnabled = false
                lblRecordTime.text = convertNSTimeInterval2String(0)
            }
            selectAudioFile()
            if !isRecordMede {
                initPlay()
            } else {
                initRecord()
            }
        }
        
        
        @IBAction func btnRecord(_ sender: UIButton) {
            if (sender as AnyObject).titleLabel??.text == "Record" {
                audioRecorder.record()
                (sender as AnyObject).setTitle("Record", 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)
        }
        
    }

     

     

    도서 스위프트로 아이폰앱 만들기를 참고했습니다.

    반응형

    'swift' 카테고리의 다른 글

    Swift 지도 만들기 Map View  (0) 2024.11.23
    swift present 메서드  (0) 2024.10.26
    unrecognized selector sent to instance  (1) 2024.10.26
    Swift 피커 뷰 사용해서 원하는 항목 선택하기  (1) 2024.10.13
    Swift 알람 시계 만들기  (2) 2024.10.13

    댓글

Designed by Tistory.