如何使UISlider与音频进度匹配

时间:2017-03-07 14:43:52

标签: ios swift avfoundation uislider

我正在创建一个简单的音乐应用程序,我想知道如何让UiSlider跟踪音频文件的进度。到目前为止,这是我的项目:

Storyboard

代码:

import UIKit
import AVFoundation

class SongDetailViewController: UITableViewController {

    var audioPlayer = AVAudioPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "Song Name", ofType: "mp3")!))
            audioPlayer.prepareToPlay()

            var audioSession = AVAudioSession.sharedInstance()

            do {
                try audioSession.setCategory(AVAudioSessionCategoryPlayback)
            }
        }

        catch {
            print(error)
        }
    }
//    Buttons

//    Dismiss
    @IBAction func dismiss(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }

//    Play
    @IBAction func play(_ sender: Any) {
        audioPlayer.stop()
        audioPlayer.play()
    }

//    Pause
    @IBAction func pause(_ sender: Any) {
        audioPlayer.pause()
    }

//    Restart
    @IBAction func restart(_ sender: Any) {
        audioPlayer.currentTime = 0
    }

}

我想创建类似于Apple音乐应用程序的uislider,它遵循音频文件的进度,每当用户滑动球时(lol),它就会转到歌曲的那个时间。如果你能给我一些代码来完成这个,那就太棒了!

请记住,我对编码相当新,并且仍在快速学习,所以请保持简单:-)再次感谢!

2 个答案:

答案 0 :(得分:1)

如果您切换为使用AVPlayer,则可以向periodicTimeObserver添加AVPlayer。在下面的示例中,您将每1/30秒收到一次回调...

let player = AVPlayer(url: Bundle.main.url(forResource: "Song Name", withExtension: "mp3")!)

player.addPeriodicTimeObserver(forInterval: CMTimeMake(1, 30), queue: .main) { time in

    let fraction = CMTimeGetSeconds(time) / CMTimeGetSeconds(player.currentItem!.duration)

    self.slider.value = fraction
}

在代码中创建audioPlayer的位置,请替换为上面的代码。

答案 1 :(得分:1)

使用AVAudioPlayer您可以创建一个定期计时器,每秒触发几次(最多60次/秒 - 任何更多都是浪费)并根据您的音频播放器更新您的滑块currentTime {1}}财产。要将更新与屏幕刷新同步,您可以使用CADisplayLink计时器。

还应该可以在AVAudioPlayer currentTime属性上设置一个键值观察器,这样每次值都会改变你的观察者。 (我还没试过这个,但它应该工作。)