我正在创建一个简单的音乐应用程序,我想知道如何让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),它就会转到歌曲的那个时间。如果你能给我一些代码来完成这个,那就太棒了!
请记住,我对编码相当新,并且仍在快速学习,所以请保持简单:-)再次感谢!
答案 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
属性上设置一个键值观察器,这样每次值都会改变你的观察者。 (我还没试过这个,但它应该工作。)