-
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