gpt4 book ai didi

swift - MPNowPlayingInfoCenter 停止更新进度条

转载 作者:搜寻专家 更新时间:2023-10-30 22:18:21 24 4
gpt4 key购买 nike

我正在制作一个带有音乐播放器的应用程序。我已经有一段时间没有处理它了,但上次我处理它时 nowPlayingInfo 正在工作。现在,当我将它更新到 Swift 3 时,除了进度条外,一切正常。

我在这里看到了一些类似的问题,它们谈到了竞争条件,它被某些东西覆盖了,但我似乎无法弄清楚是什么。如果有帮助,我正在使用 AVQueuePlayer

跳过和上一个按钮有效,专辑封面、标题和艺术家完美更新,但耗时没有更新。当我调试时,MPNowPlayingInfoCenter.default().nowPlayingInfo 中的 MPNowPlayingInfoPropertyElapsedPlaybackTime 显示正确的数字,但控制中心的实际屏幕不是。通常,进度卡在0:01,就是不动。但是,如果我在我的应用程序中使用 slider 寻求并返回到控制中心,它会显示我寻求但停留在那个位置的时间。

这是我的setNowPlaying代码:

func setNowPlaying(_ dura: Float, timePlayed: Float) {
let s = songs[playbackInstance.currentSongIndex]
let albumArt = MPMediaItemArtwork.init(boundsSize: CGSize(width: 480, height: 360), requestHandler: { (size) -> UIImage in
return self.songImageView.image ?? #imageLiteral(resourceName: "WhiteMusic")
})
let songInfo: [String: Any]? = [
MPMediaItemPropertyTitle: s.name,
MPMediaItemPropertyArtist: s.artist,
MPMediaItemPropertyArtwork: albumArt,
MPMediaItemPropertyPlaybackDuration: dura,
MPNowPlayingInfoPropertyElapsedPlaybackTime: CMTimeGetSeconds(player.currentTime())
]

MPNowPlayingInfoCenter.default().nowPlayingInfo = songInfo
}

我曾经将 MPNowPlayingInfoPropertyElapsedPlaybackTime 设置为传递给该方法的 timePlayed 变量,但由于它不起作用,我尝试了 player.currentTime( ) 正如其他问题所推荐的那样,它可能比我使用的方法更好。

以下是搜索代码,以防有帮助:

@IBAction func sliderChanged(_ sender: UISlider) {
if timer.isValid {
currentTimeLabel.text = secondsToText(sender.value)
player.seek(to: CMTimeMakeWithSeconds(Float64(sender.value), player.currentItem!.currentTime().timescale))
}
}

出于某种原因,这是唯一会更新控制中心信息的东西。

最佳答案

这对我有用,也许对你有帮助。

         func setNowPlaying(_ dura: Float, timePlayed: Float) {
let s = songs[playbackInstance.currentSongIndex]
let albumArt = MPMediaItemArtwork.init(boundsSize: CGSize(width: 480, height: 360), requestHandler: { (size) -> UIImage in
return self.songImageView.image ?? #imageLiteral(resourceName: "WhiteMusic")
})

MPNowPlayingInfoCenter.default().nowPlayingInfo = [
MPMediaItemPropertyTitle: s.name,
MPMediaItemPropertyArtist: s.artist,
MPMediaItemPropertyArtwork: albumArt as Any,
MPMediaItemPropertyPlaybackDuration: dura,
MPNowPlayingInfoPropertyElapsedPlaybackTime : player.currentTime()
]
UIApplication.shared.beginReceivingRemoteControlEvents()
becomeFirstResponder()

}


@IBAction func sliderAction(_ sender: Any) {
if player != nil {
Thread.cancelPreviousPerformRequests(withTarget: self)
self.perform(#selector(playAtSelectedTime) , with: nil, afterDelay: 0.2)
}
}

@objc func playAtSelectedTime(){
let selectedTime = Double(progressSlider.value)
player.currentTime = selectedTime
convertTimingToTextLabel(selectedTime, label: self.runningLabel)
convertTimingToTextLabel(Double(player.duration-player.currentTime), label: self.durationLabel)
durationLabel.text = " -"+durationLabel.text!
updateSlider()
}


func updateSlider(){
if timer != nil{
timer.invalidate()
}

timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(playingSong) , userInfo: nil, repeats: true)
}


@objc func playingSong(){
progressSlider.minimumValue = 0
progressSlider.maximumValue = Float(player.duration)
progressSlider.value = Float(player.currentTime)

convertTimingToTextLabel(Double(player.currentTime), label: self.runningLabel)
convertTimingToTextLabel(Double(player.duration-player.currentTime), label: self.durationLabel)
durationLabel.text = durationLabel.text!
}



func convertTimingToTextLabel(_ time: Double, label: UILabel) {
let minute = Int(time / 60)
let seconds = Int(time - Double(minute * 60))
setTimingSongForLabel(minute, seconds: seconds, label: label)
}

func setTimingSongForLabel(_ minute: Int, seconds: Int, label: UILabel) {
let mStr = minute > 9 ? "\(minute)":"0\(minute)"
let sStr = seconds > 9 ? "\(seconds)":"0\(seconds)"
label.text = "\(mStr):\(sStr)"
}

关于swift - MPNowPlayingInfoCenter 停止更新进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572623/

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