Skip to content

Latest commit

 

History

History
121 lines (89 loc) · 4.19 KB

16차 스터디.md

File metadata and controls

121 lines (89 loc) · 4.19 KB

AudioPlayer(AVAduioPlayer) + Slider


  • 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
  • 위와같이 슬라이더의 최대값과 최저값을 셋팅
  • 당연히 최대값은 곡의 길이 만큼으로 셋팅, 그래야 슬라이더의 길이 만큼 노래를 이동

2