如何在播放时在标签中获取 AVAudioplayer 中的当前时间
Posted
技术标签:
【中文标题】如何在播放时在标签中获取 AVAudioplayer 中的当前时间【英文标题】:how to get current time in AVAudioplayer in a label while playing 【发布时间】:2017-03-29 23:31:21 【问题描述】:我尝试构建一个应用程序来播放 MP3 文件。我想在播放时获取当前时间和持续时间以在 2 个标签中显示。
我使用了这个代码:
let duration = Int((player1?.duration)!)
let minutes2 = duration/60
let seconds2 = duration - minutes2 * 60
durLabel.text = NSString(format: "%02d:%02d", minutes2,seconds2) as String
let currentTime1 = Int((player1?.currentTime)!)
let minutes = currentTime1/60
let seconds = currentTime1 - minutes * 60
curLabel.text = NSString(format: "%02d:%02d", minutes,seconds) as String
持续时间显示歌曲的一半。
例如: 如果歌曲的持续时间是 20 分 40 秒,它会显示一半像 10:20。但是在当前时间没有进展的情况下,显示00:00
非常感谢。
【问题讨论】:
【参考方案1】: // this is to compute and show remaining time
let duration = Int((player1?.duration - (player1?.currentTime))!)
let minutes2 = duration/60
let seconds2 = duration - minutes2 * 60
durLabel.text = NSString(format: "%02d:%02d", minutes2,seconds2) as String
//This is to show and compute current time
let currentTime1 = Int((player1?.currentTime)!)
let minutes = currentTime1/60
let seconds = currentTime1 - minutes * 60
curLabel.text = NSString(format: "%02d:%02d", minutes,seconds) as String
【讨论】:
在第一行代码有一个错误:Binary operator '-' cannot be applied to two 'TimeInterval?' (aka 'Optional<Double>') operands
作为解决方案,只需将其类型转换为Int
类似这样的let duration = Int((Int(player1!.duration) - Int(player1!.currentTime)))
@Emm 你用什么类型的播放器? AVAudioPlayer 还是 AVplayer?【参考方案2】:
玩家的当前时间不会自动更新。相反,您必须使用计时器定期更新当前时间。如果您想了解更多详细信息,请查看以下主题。
check avaudioplayer's current playback time
【讨论】:
我使用的是 swift 而不是 objective-c ,任何帮助将不胜感激 我知道你在寻求 Swift 帮助,但代码是一样的。如果你有兴趣,你应该能够很容易地弄清楚。你需要知道的是,Objective-C 中的NSTimer
在 Swift 中是 Timer
。弄清楚如何转换代码应该足够简单......
感谢您的回答,我之所以这么问是因为我是 swift 新手
我明白,但从长远来看,我给你的答案不会真正帮助你,因为你不会从中吸取教训。尝试将 Objective-C 代码转换为 Swift 并查看最终结果。如果您遇到更多问题或有其他问题,请在此处提问,我会提供帮助。
祝你好运!如果您遇到任何问题,请在此处提问或在 SO 上提出另一个问题。只要你愿意学习,人们就会帮助你:)【参考方案3】:
如果你有 Slider 在 mp3 文件上寻找,像这样:
@IBOutlet weak var slidetOutlet: UISlider!
你可以像这样更新你的 UILabel:
self.lblPlayerTime.text = self.secondsToHoursMinutesSeconds(seconds: Double( self.slidetOutlet.value ))
初始化你的播放器和滑块:
func playerInit()
guard let url = URL(string: urlAudio) else
return
do
try AVAudiosession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
print("AVAudioSession Category Playback OK")
do
try AVAudioSession.sharedInstance().setActive(true)
print("AVAudioSession is Active")
playerItem = AVPlayerItem(url: url)
player = AVPlayer(playerItem: playerItem)
player!.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main) (CMTime) -> Void in
if self.player!.currentItem?.status == .readyToPlay
let time : Float64 = CMTimeGetSeconds(self.player!.currentTime());
self.slidetOutlet.value = Float ( time )
self.slidetOutlet.minimumValue = 0
let duration : CMTime = self.playerItem!.asset.duration
let seconds : Float64 = CMTimeGetSeconds(duration)
self.slidetOutlet.maximumValue = Float(seconds)
self.lblStartTimePlayer.text = self.secondsToHoursMinutesSeconds(seconds: seconds)
self.lblPlayerTime.text = self.secondsToHoursMinutesSeconds(seconds: Double( self.slidetOutlet.value ))
catch let error as NSError
print(error.localizedDescription)
catch let error as NSError
print(error.localizedDescription)
用于转换时间:
func secondsToHoursMinutesSeconds (seconds : Double) -> (String)
let (hr, minf) = modf (seconds / 3600)
let (min, secf) = modf (60 * minf)
return ("\(Int(hr)):\(Int(min)):\(Int(60 * secf))")
【讨论】:
用户要求使用 AVAudioPlayer。您的代码在 AVPlayer 中以上是关于如何在播放时在标签中获取 AVAudioplayer 中的当前时间的主要内容,如果未能解决你的问题,请参考以下文章