[iOS] AVAudioPlayer 채택해서 사용하고 예제만들기

코르피·2022년 2월 11일
0

오늘은 AVAudioPlayer를 채택하고 실행해보는 예제를 만들었다.

처음 ViewController에 스택뷰를 이용해서 뷰들을 집어넣고
constraint를 설정해서 뷰를 조정했다

뷰를 설정하고 조정한 모습

오토레이아웃을 통해 가변적인 뷰를 만들고 싶었는데 아직은 좀 부족한듯 하다..

import UIKit
import AVFoundation


class ViewController: UIViewController {
    
    // Outlet variable
    @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!
    
    // Audio variable
    
    // 오디오플레이어 변수
    var audioPlayer: AVAudioPlayer!
    // 재생할 파일명
    var audioFile: Data!
    // 최대 볼륨
    let MAX_VOLUME: Float = 10.0
    // 타이머를위한 변수
    var progressTimer: Timer!
    
    
extension ViewController: AVAudioPlayerDelegate{
    
}

먼저 AVFoundation을 import하고 Delegate를 extension해서 채택해주었다

그다음 변수를 지정해주었는데 변수는 오디오플레이어를 받을 audioPlayer변수와
재생할 파일명, 최대 볼륨을 지정해줄 변수, 타이머를 위한 변수를 만들었다

  func initPlay() {
        do {
            audioPlayer = try AVAudioPlayer(data: 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
        
    } 

오디오 플레이어를 설정해줄 init함수를 만들어주었다
try catch문을 사용해서 오디오파일을 적용한 플레이어를 가져왔고 오류가 날 시에 프린트문을 작성했다.

이후에 최대볼륨을 조정할 maximumValue를 지정해주고
기본값음 0으로 만들었다

음악이 흐르며 진행할 프로그레스바도 0으로 설정했다.

delegate는 자신인 ViewController로 설정했고
prepareToPlay함수로 실행할 준비를 했다.

    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        audioFile = NSDataAsset(name: "Sicilian_Breeze")?.data
        initPlay()
    }
    
    func initPlay() {
        do {
            audioPlayer = try AVAudioPlayer(data: 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

        lblCurrentTime.text = convertNSTimerInterval12String(0)
        lblEndTime.text = convertNSTimerInterval12String(audioPlayer.duration)
        
        setPlayButtons(true, pause: false, stop: false)
        
    }
    func setPlayButtons(_ play:Bool, pause:Bool, stop: Bool) {
        btnPlay.isEnabled = play
        btnPause.isEnabled = pause
        btnStop.isEnabled = stop
    }
    
    func convertNSTimerInterval12String(_ 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
    }

viewDidLoad에 오디오파일도 만들어주고
Asset에 들어있는 음악파일을 받아와서 저장해주었다

함수를 추가해서 현재 시간과 끝 시간을 설정해줄 텍스트를 설정해주었다
conveertNSTimerInterval12String 함수인데 시간을 00:00 02:23 등의 숫자로 바꿔주는 함수이다.
min은 time을 60으로 나눈 몫을 설정하고
sec은 time의 truncatingRemainder 함수로 60으로 나눈 나머지로 설정해주었다.

버튼도 setPlayButton 함수를 만들어서 상태를 조정할 수 있게 했다.

let timePlayerSelector: Selector = #selector(ViewController.updatePlayTime)

@objc func updatePlayTime() {
        lblCurrentTime.text = convertNSTimerInterval12String(audioPlayer.currentTime)
        pvProgressPlay.progress = Float(audioPlayer.currentTime/audioPlayer.duration)
    }
    
    @IBAction func btnPlayAudio(_ sender: UIButton) {
        audioPlayer.play()
        setPlayButtons(false, pause: true, stop: true)
        progressTimer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: timePlayerSelector, userInfo: nil, repeats: true)
    }
    
    @IBAction func btnPauseAudio(_ sender: UIButton) {
        audioPlayer.pause()
        setPlayButtons(true, pause: false, stop: true)
    }
    
    @IBAction func btnStopAudio(_ sender: UIButton) {
        audioPlayer.stop()
        audioPlayer.currentTime = 0
        lblCurrentTime.text = convertNSTimerInterval12String(0)
        setPlayButtons(true, pause: false, stop: false)
        progressTimer.invalidate()
        
    }
    @IBAction func slChangeVolume(_ sender: UISlider) {
        audioPlayer.volume = slVolume.value
    }
    
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        progressTimer.invalidate()
        setPlayButtons(true, pause: false, stop: false)
    }

다음은 버튼 별로 기능들을 설정해 주었다.

플레이 버튼을 눌렀을 때는 타이머를 설정해서 셀렉터에 있는 함수를 실행하게 했다.
셀렉터의 함수는 현재 시간과 프로그레스바를 업데이트하는 작업이다

멈춤 버튼을 눌렀을 때는 오디오플레이를 멈추고

스탑 버튼을 눌렀을 때는 오디오를 멈추고 초기로 돌리고, 현재시간과 타이머를 재설정하며 타이머를 Invalidate상태로 두어 멈추게 했다.

마찬가지로 오디오가 완료 되었을 때를 관리하는 audioPlayerDidFinishPlaying 함수를 넣어서 타이머를 멈추게 했다.

잘 실행된다! 이를 활용해서 멜론같은 음악스트리밍 앱을 클론코딩 해봐도 좋을듯 하다!

profile
행복합시다!!

0개의 댓글