- Bundle.main.path와 AVAudioPlayer(contentsof: URL)을 이용해서 곡을 초기화 시키고 곡을 이동 시키는 것을 다룰려 했으나, iOS13부터 url Return문제로 안되는 듯? 추가 Search 필요
- NSData로 초기화해서 문제를 해결 (곡을 1,2,3,4 이렇게 지정해서 카운팅 시키는 법으로, 노래 제목으로 다룰려면 배열에 곡 이름 넣고 index로 처리시키면 될 듯)
let path = Bundle.main.path(forResource: "노래제목(1)", ofType: "mp3")!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
} catch {
// can't load file , print error
}
- 원래는 위와 같이도 AVaudioPlayer를 초기화 가능했으나, 지금은 안되는 듯 (해당 관련 포스팅2018년, 최근 댓글에 url return관련해서 안된다고 댓글 달려있음)
- 실제로 iOS13 , Xcode11에서 실행시 파일을 못찾아서 path에서 옵셔널 Error가 발생
guard let soundAsset: NSDataAsset = NSDataAsset(name: "\(song[count])") else {
print("음원 파일 없습니다.")
return
}
do {
try self.avPlayer = AVAudioPlayer(data: soundAsset.data)
self.avPlayer.delegate = self
} catch let error as NSError {
print("플레이어 초기화 실패")
print("에러코드: \(error.code)"")
}
- 다음과 같이 NSDataAsset으로 초기화
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
- play버튼을 누르면 음악이 재생되고, 재생 버튼을 다시누르면 pause가 되게 설정
- 따라서 타이머가 돌아가게 하는 것을 playpause func에 설정
@objc func updateTime() {
let currentTime = Int(avPlayer.currentTime)
let minutes = currentTime/60
let seconds = currentTime - minutes * 60
timeLabel.text = String(format: "%02d:%02d", minutes,seconds) as String
}
- 위와같이 플레이어의 currentTime을 이용해 얼마나 재생이 되었는지 레이블에 표시
- 우리가 레이블에 표현할 것은 실수가 아닌 정수형이므로, Int()를 사용해 실수에서 인트형으로 자료형 변환
@IBAction func touchUpNextSongButton(_ sender: UIButton) {
print("nextSong")
if count<2{
count+=1
}else{
count=0
}
initializePlayer()
self.avPlayer?.play()
}
@IBAction func touchUpPreSongButton(_ sender: UIButton) {
print("PreSong")
if count>0{
count -= 1
}else {
count = 2
}
initializePlayer()
self.avPlayer?.play()
}
-
다음곡 재생을 위해 전역변수 count를 이용해 AVAduioPlayer를 노래에 맞춰 초기화
-
버튼을 누른후 바로 재생되도록 play()함수 설정
-
노래가 총 3곡이라서 배열의 Size()를 이용안했지만, 위와 같이 최대 곡이나 최저 곡에 다달했을때 무한 스크롤 처럼 첫곡에서 이전 곡을 누르면 마지막 곡이 재생되도록 셋팅했다.
-
아래와 같은 메소드(AVAudioPalyerDelegate)로 곡의 재생이 끝났을때 다음곡으로 자동으로 넘어가게 설정도 가능하다.
-
func audioPlayerDidFinishPlaying(AVAudioPlayer, successfully: Bool)
@IBAction func valueChangeMusicSlider(_ sender: UISlider) {
if sender.isTracking{ return}
self.avPlayer.currentTime = TimeInterval(sender.value)
}
- UISlider를 만들어서 슬라이더를 이동한 만큼 노래를 이동 시키게 만들었음
self.musicSlider.maximumValue = Float(self.avPlayer.duration)
self.musicSlider.minimumValue = 0
- 위와같이 슬라이더의 최대값과 최저값을 셋팅
- 당연히 최대값은 곡의 길이 만큼으로 셋팅, 그래야 슬라이더의 길이 만큼 노래를 이동