滑块在Swift中不随音频一起移动

问题描述 投票:1回答:1

我正在尝试在我的应用程序中实现音频播放器来播放音频文件。我正在使用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) {
    }
}
swift avfoundation avaudioplayer
1个回答
0
投票

您可以使用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

      }
}
© www.soinside.com 2019 - 2024. All rights reserved.