Swift에서 오디오를 호출하는 예제 소스
1. import AVFoundation 관련 라이브러리 참조
2. 변수 선언
@IBOutlet weak var pvProgressPlay: UIProgressView!
var audioPlayer : AVAudioPlayer!
var audioFile : URL!
let MAX_VOLUME : Float = 10.0
var progressTimer : Timer!
// 플레이 타임을 프로그레이스바로 표현
let timePlayerSelector : Selector = #selector(ViewController.updatePlaytime)
3. 파일 위치 설정하고, play 설정값을 세팅 후, audioPlayer.play() 호출
4. Record가 되지 않으면, adioRecord.record()의 반환값이 Bool 이므로, 반환값을 출력해 보면 됨.
전체 소스는 아래와 같습니다.(Record 포함)
import UIKit
import AVFoundation
class ViewController: UIViewController, AVAudioPlayerDelegate, AVAudioRecorderDelegate {
@IBOutlet weak var pvProgressPlay: UIProgressView!
@IBOutlet weak var lblCurrentTime: UILabel!
@IBOutlet weak var lblEndTime: UILabel!
@IBOutlet weak var btnPlay: UIButton!
@IBOutlet weak var btnPause: UIButton!
@IBOutlet weak var btnStop: UIButton!
@IBOutlet weak var slVolume: UISlider!
@IBOutlet weak var swMode: UISwitch!
@IBOutlet weak var lblMode: UILabel!
@IBOutlet weak var btnRecord: UIButton!
@IBOutlet weak var lblRecordTime: UILabel!
var audioPlayer : AVAudioPlayer!
var audioFile : URL!
let MAX_VOLUME : Float = 10.0
var progressTimer : Timer!
let timePlayerSelector : Selector = #selector(ViewController.updatePlaytime)
let timeRecordSelector : Selector = #selector(ViewController.updateRecordtime)
var audioRecorder : AVAudioRecorder!
var isRecordMode = false
override func viewDidLoad() {
super.viewDidLoad()
selectAudioFile()
if !isRecordMode {
initPlay()
btnRecord.isEnabled = false
lblRecordTime.isEnabled = false
}else {
initRecord()
}
// Do any additional setup after loading the view.
}
func selectAudioFile() {
if !isRecordMode {
audioFile = Bundle.main.url(forResource: "Helium", withExtension: "mp3")
initPlay()
} 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("************ ERROR-initRecord : \(error)")
}
audioRecorder.delegate = self
audioRecorder.isMeteringEnabled = true
audioRecorder.prepareToRecord()
slVolume.value = 1.0
audioPlayer.volume = slVolume.value
lblEndTime.text = convertNSTimeInterval2String(0)
lblCurrentTime.text = convertNSTimeInterval2String(0)
setPlayButtons(false, false, false)
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(AVAudioSession.Category.playAndRecord)
} 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, false, false)
}
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
}
func setPlayButtons(_ play:Bool , _ pause:Bool, _ stop:Bool) {
btnPlay.isEnabled = play
btnPause.isEnabled = pause
btnStop.isEnabled = stop
}
@IBAction func btnPlayAudio(_ sender: UIButton) {
setPlayButtons(false, true, true)
audioPlayer.play()
progressTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: timePlayerSelector, userInfo: nil, repeats: true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@objc func updatePlaytime() {
lblCurrentTime.text = convertNSTimeInterval2String(audioPlayer.currentTime)
pvProgressPlay.progress = Float(audioPlayer.currentTime / audioPlayer.duration)
print(audioPlayer.currentTime.description + ", " + audioPlayer.duration.description)
}
@IBAction func btnPauseAudio(_ sender: UIButton) {
setPlayButtons(true, false, true)
audioPlayer.pause()
}
@IBAction func btnStopAudio(_ sender: UIButton) {
setPlayButtons(true, false, false)
pvProgressPlay.progress = 0
audioPlayer.stop()
audioPlayer.currentTime = 0
lblCurrentTime.text = convertNSTimeInterval2String(0)
progressTimer.invalidate()
}
@IBAction func slChangeVolume(_ sender: UISlider) {
audioPlayer.volume = slVolume.value
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
progressTimer.invalidate()
setPlayButtons(true, false, false)
}
@IBAction func swChangeMode(_ 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" {
if sender.titleLabel?.text == "Record" {
var isRecording : Bool = audioRecorder.record()
print("IS RECORDING? : ", isRecording.description)
//(sender as AnyObject).setTitle("Stop", for: UIControl.State())
sender.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)
}
}
'개발자 넋두리 > 아이폰개발(Swift)' 카테고리의 다른 글
Swift 탭터치(tap-touch) 카운트 예제 (0) | 2025.01.22 |
---|---|
Swift 동영상 플레이 예제. (0) | 2025.01.21 |
Swift 오류-this class is not key value coding-compliant for the key btnSize (4) | 2024.12.27 |
Swift 아이폰 개발에서 보통함수를 익명함수로 만드는 과정 (1) | 2024.12.26 |
(문제해결) swift Main.storyboard 파일명 변경시 (1) | 2023.12.22 |