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)
    }
    
}

 

 

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

반응형