본문 바로가기

ISSUE

[ISSUE] AVFoundation ( 2 ) - AVAudioPlayer

AVPlayer 포멧 관련 issue를 다뤘던 저번 포스팅에 이어서

이번에는 AVAudioPlayer로 진행하며 겪은 issue에 대해 얘기하겠다.

 

일단 AVAudioPlayer는 AVPlayer와는 다르게

로컬에 저장된 오디오 파일의 재생 기능만을 제공한다.

또한 addPeriodicTimeObserver와 같이 주기적으로 호출되어

현재 재생시간에 따라 인터페이스를 변경하고 싶을때 주로 사용하는 

메소드가 따로 구비되어있지 않았다.

 

Apple 공식문서와 많은 블로그에서 AVAudioPlayer는 Stream이 불가능하다고 말한다.

하지만 왜 나는 stream이 가능한걸까..... ( 뭔가 잘못이해하고 있는거 같은데 이거에 대해 아시는 분은  댓글 달아주시면  감사하겠습니다!!)

 

AVAudioPlayer의 init중

Data를 인자로 받는 init이 있길래

해당 URL을 Data화 시키고

한번 시도해봤는데 재생이 되었다...

 guard let url = URL(string: "https://........") else {
        print("wrong url")
        return
    }
        
    do {
        let data = try Data(contentsOf: url)
        player = try AVAudioPlayer.init(data: data)
    } catch let error {
        print(error.localizedDescription)
    }

 

아무튼 AVAudioPlayer는

따로 Timer를 구현해주어야 한다.

그리고 그 Timer의 interval을 간격으로 

slider의 value와 currentTime label의 값을

설정해줄것이다.

 

// Timer
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(handler), userInfo: nil, repeats: true)

// set maxValue
slider.maximumValue = Float(player.duration)
@objc private func handler() {
    guard let player = player else { return }
    
    // slider set
    slider.setValue(Float(player.currentTime), animated: true)

    // durationTime
    let duration = Int((player.duration - (player.currentTime)))
    let minutes2 = duration / 60
    let seconds2 = duration - minutes2 * 60
    durationTime.text = NSString(format: "%02d:%02d", minutes2,seconds2) as String
    
    // currentTime
    let currentTime1 = Int((player.currentTime))
    let minutes = currentTime1/60
    let seconds = currentTime1 - minutes * 60
    currentTime.text = NSString(format: "%02d:%02d", minutes,seconds) as String
}
player.play()
button.isSelected.toggle()

 

이번 과정에서 나타난 issue는 

error나 bug에 관한 issue가 아니라

기술적인면에 있었다.

 

진행하는 프로젝트의 앱 특성상

audio의 rate와 pitch가

사용자에 의해 실시간으로 제어가 가능해야 했었는데

AVAudioPlayer로 그에 걸맞는 기능 구현은 불가능하다는것을 검색을 통해 깨달았다.

 

StackOverFlow에서도 AudioEngine을 사용하여 

구현하라는 답변밖에 없었다.

 

그래서 AVAudioPlayer를 사용한 기능구현은 중단했고

AVAudioEngine을 사용해서 다시 빌드업 하기로 결정했다. 😅