我正在尝试在我的应用程序中实现音频播放器来播放音频文件。我正在使用AVFoundation框架来播放音频文件。我有一些控件,例如滑块,用于更改音频流和速率按钮,以提高和降低音频速度。滑块应与音频一起移动,如果更改了滑块的位置,则音频应从放置滑块的位置开始播放。即使单击了速率按钮,音频也应从播放的位置开始提高速度。如何在Swift 5中使用它?
import AVFoundation
class AudioPlayer: UIViewController, AVAudioPlayerDelegate {
@IBOutlet weak var slider: UISlider!
@IBOutlet weak var currentTime: UILabel!
@IBOutlet weak var totalDuration: UILabel!
@IBAction func playButton(_ sender: Any) {
do {
audioPlayer = try AVAudioPlayer(contentsOf: audioPath)
guard let player = audioPlayer else { return }
player.prepareToPlay()
player.enableRate = true
player.play()
} catch let error {
print(error.localizedDescription)
}
}
@IBAction func slideMoved(_ sender: Any) {
slider.maximumValue = Float(audioPlayer.duration)
}
var audioPlayer:AVAudioPlayer!
override func viewDidLoad() {
self.audioPlayer = try AVAudioPlayer(contentsOf: path)
self.audioPlayer.enableRate = true
self.audioPlayer.prepareToPlay()
self.audioPlayer.delegate = self
}
@objc func speed1ViewTapped(_ sender: UITapGestureRecognizer? = nil) {
}
@objc func speed2ViewTapped(_ sender: UITapGestureRecognizer? = nil) {
}
@objc func speed3ViewTapped(_ sender: UITapGestureRecognizer? = nil) {
}
}
您可以使用AVPlayer的PeriodicTime Observer更新滑块进度
let _ = audioPlayer.addPeriodicTimeObserver(forInterval: CMTime(seconds: 1, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: DispatchQueue.main) { [weak self] (time) in
self?.slider.value = Float(CMTimeGetSeconds(time)) / Float(totalDuration)
}
而不是设置滑块的最大值...也要更改此功能
@IBAction func slideMoved(_ sender: Any) {
let value = self.slider.value
let durationToSeek = Float(totalDuration) * value
audioPlayer.seek(to: CMTimeMakeWithSeconds(Float64(durationToSeek),player.currentItem!.duration.timescale)) { [weak self](state) in
}
}