[swift] 사운드 재생 시간에 따라 프로그레스 바 변경하기

사운드 재생 시간에 따라 프로그레스 바를 동적으로 변경하려면 Swift 언어를 사용하여 다음과 같이 할 수 있습니다.

재생 시간 가져오기

먼저, 사운드 파일의 재생 시간을 가져와야 합니다. AVAudioPlayer 클래스를 사용하여 사운드 파일을 재생합니다. 여기서는 “sound.mp3”라는 파일을 예로 들겠습니다.

import AVFoundation

let soundURL = Bundle.main.url(forResource: "sound", withExtension: "mp3")
let player = try AVAudioPlayer(contentsOf: soundURL!)
let duration = player.duration

위의 예제에서 duration 변수에 사운드 파일의 재생 시간이 초 단위로 저장됩니다.

프로그레스 바 업데이트하기

프로그레스 바를 업데이트하기 위해 UIProgressView 클래스를 사용합니다. 스토리보드에서 프로그레스 바를 만들고 아웃렛으로 연결합니다. 여기서는 progressBar라는 아웃렛을 가정하겠습니다.

import UIKit

@IBOutlet weak var progressBar: UIProgressView!

사운드 파일을 재생하면서 프로그레스 바를 업데이트해야 합니다. 이를 위해 AVAudioPlayerDelegate 프로토콜을 사용하여 audioPlayerDidFinishPlaying(_:successfully:) 메서드를 구현합니다.

extension ViewController: AVAudioPlayerDelegate {
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        progressBar.progress = 1.0
    }
    
    func audioPlayerUpdateProgress(_ player: AVAudioPlayer) {
        let currentTime = player.currentTime
        let progress = Float(currentTime / duration)
        progressBar.progress = progress
    }
}

위의 예제에서 audioPlayerUpdateProgress(_:) 메서드는 재생 시간에 따라 프로그레스 바를 업데이트합니다. 재생이 종료되면 audioPlayerDidFinishPlaying(_:successfully:) 메서드를 사용하여 프로그레스 바를 100%로 설정합니다.

재생 시간 업데이트하기

사운드 파일을 재생하는 동안 재생 시간을 주기적으로 업데이트해야 합니다. 이를 위해 타이머를 사용합니다. 아래의 코드를 사용하여 타이머를 설정합니다.

var timer: Timer?

func startTimer() {
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateProgress), userInfo: nil, repeats: true)
}

func stopTimer() {
    timer?.invalidate()
    timer = nil
}

@objc func updateProgress() {
    audioPlayerUpdateProgress(player)
}

위의 예제에서 startTimer() 메서드는 타이머를 시작하고, stopTimer() 메서드는 타이머를 정지합니다. updateProgress() 메서드는 주기적으로 호출되어 프로그레스 바를 업데이트합니다. audioPlayerUpdateProgress(_:) 메서드를 호출하여 재생 시간에 따라 업데이트됩니다.

재생 시작하기

위의 예제를 사용하여 재생을 시작해보겠습니다. viewDidLoad() 메서드에서 초기 설정을 진행합니다.

override func viewDidLoad() {
    super.viewDidLoad()
    player.delegate = self
    progressBar.progress = 0.0
}

viewDidAppear(_:) 메서드에서 재생을 시작합니다.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    startTimer()
    player.play()
}

이제 사운드 파일을 재생하면서 프로그레스 바가 재생 시간에 따라 동적으로 변경됩니다.

참고 자료