如何使UISlider匹配音频进度

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

故事板

码:

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),它就会转到歌曲的那个时间。 如果你能给我一些代码来完成这个,那就太棒了!

请记住,我是一个相当新的编码,我仍然学习迅速,所以保持简单:-)再次感谢!

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

还应该可以在AVAudioPlayercurrentTime属性上设置键值观察器,以便每次值更改观察者触发时。 (我没试过,但它应该有效。)

如果切换到使用AVPlayer ,则可以向AVPlayer添加periodicTimeObserver 。 在下面的示例中,您将每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 ,请替换为上面的代码。