Ползунок не движется вместе со звуком в Swift - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь реализовать в своем приложении аудиоплеер для воспроизведения аудиофайла. Я использую среду 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) {
    }
}

1 Ответ

1 голос
/ 08 мая 2020

Вы можете использовать PeriodicTime Observer AVPlayer для обновления хода ползунка

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

      }
}
...