我正在尝试在我的应用程序中实现音频播放器来播放音频文件。我正在使用 AVFoundation 框架来播放音频文件。我有像 slider 这样的控件来改变音频流和速率按钮来增加和降低音频速度。 slider 应与音频一起移动,如果 slider 位置发生更改,音频应从放置 slider 的位置播放。即使单击速率按钮,音频也应该从播放位置提高速度。我怎样才能让它在 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 来更新您的 slider 进度
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)
}
而不是设置 slider 的最大值...也更改此功能
@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
}
}
关于ios - slider 在 Swift 中不与音频一起移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61673362/