gpt4 book ai didi

ios - 如何通过 AVAudioPlayer 当前时间更新播放器 slider 句柄当前值

转载 作者:行者123 更新时间:2023-11-28 07:42:22 27 4
gpt4 key购买 nike

现在我将 MSCircularSlider 库用作 Cocoapod。它的 slider.valueslider.currentValue 并且当我尝试做简单的 UISlider (尝试等于 slider.valueplayer.currentTime),它运行良好,但是当我尝试在 CircularSlider 中执行此操作时,句柄没有移动到 AVAudioPlayer.currentTime.

如何解决?

请帮帮我!

let player = AVAudioPlayer()

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

let cell = collectionView.cellForItem(at: indexPath) as! CustomCollectionCell

print("tapped")

guard let url = Bundle.main.url(forResource: songsData[indexPath.row].name, withExtension: "mp3") else { return }


do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers)
try AVAudioSession.sharedInstance().setActive(true)

player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

} catch let error {
print(error.localizedDescription)
}

player.prepareToPlay()
timerLabel.text = String(player.currentTime)
slider.alpha = 1
slider.maximumValue = Float(player.duration)
slider.currentValue = 0.0

Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
player.play()
}

@objc func updateTime(_ timer: Timer) {
let currentTime = player.currentTime
var elapsedTime: TimeInterval = currentTime
let minutes = UInt8(elapsedTime / 60.0)
elapsedTime -= (TimeInterval(minutes) * 60)
let seconds = UInt8(elapsedTime)
elapsedTime -= TimeInterval(seconds)
let strMinutes = String(format: "%02d", minutes)
let strSeconds = String(format: "%02d", seconds)
timerLabel.text = "\(strMinutes):\(strSeconds)"
timer.invalidate()
self.slider.currentValue = Float(self.player.currentTime)
timer.invalidate()
}

最佳答案

您的 updateTime(_:) 代码使您的计时器无效。 (两次!)我预计它会在 0.01 秒后触发一次,然后再也不会触发,因此您可能看不到 slider 值的明显变化。

去除对 timer.invalidate() 的调用,除非声音播放完毕。

我之前没有使用过那个特定的框架,所以我不确定它是否能像您使用的那样工作,但快速浏览一下 README 文件表明您是这样的。

另一方面,Timer 对象有点粗糙,分辨率最多只有 0.02 秒,因此间隔为 0.01 秒的计时器不太可能经常触发。此外,iOS 设备屏幕的刷新率为 1/60 秒,因此尝试更频繁地更新屏幕毫无意义。

如果您真的需要在每次屏幕更新时更新的平滑绘图,您应该考虑使用 CADisplayLink 计时器,但对于像这样简单的事情,计时器间隔为 1/30 秒左右应该没问题。

关于ios - 如何通过 AVAudioPlayer 当前时间更新播放器 slider 句柄当前值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51967121/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com