[英]How To Make UISlider match Audio progress
我正在創建一個簡單的音樂應用程序,我想知道如何制作 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 Music 應用程序的 uislider,它會跟蹤音頻文件的進度,並且每當用戶滑動球(笑)時,它就會轉到歌曲的那個時間。 如果你能給我一些代碼來完成這個,那就太棒了!
請記住,我對編碼還很陌生,並且仍在快速學習,所以請保持簡單:-) 再次感謝!
如果您切換到使用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
,替換為上面的代碼。
使用AVAudioPlayer
您可以創建一個周期性計時器,每秒觸發幾次(最多 60 次/秒 - 再多就會浪費)並根據音頻播放器的currentTime
屬性更新滑塊。 要將更新與屏幕刷新同步,您可以使用CADisplayLink
計時器。
我的這部分答案不起作用:
還應該可以在您的
AVAudioPlayer
的currentTime
屬性上設置一個鍵值觀察器,以便每次值更改時您的觀察器都會觸發。 (我沒有試過這個,但它應該可以工作。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.