ios - slider 在 Swift 中不与音频一起移动

标签 ios swift avfoundation avaudioplayer

我正在尝试在我的应用程序中实现音频播放器来播放音频文件。我正在使用 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/

相关文章:

ios - 在 AVCaptureMovieFileOutput 之后使用 AVPlayer 播放视频

swift - ReplayKit:RPScreenRecorder.shared().startCapture() 不工作

swift - 无效更新 : invalid number of items in section 0.

xcode - 随机数在 swift 语言中生成问题 - EXC_BAD_INSTRUCTION

ios - Swift 函数返回得不够快

ios - 为什么 SKSpriteNode 不响应 applyForce 或 applyImpulse?

swift - CLLocationManager.requestLocation 调用它的委托(delegate)需要多长时间

xcode - 使用 AVPlayer 播放多个音频文件

ios - 应用内电子邮件将发送电子邮件但不会在 Xcode 中关闭

html - 用 HTML 元素替换占位符 HTML 注释