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)
}
}
도서 스위프트로 아이폰앱 만들기를 참고했습니다.
반응형